29 character*20 labmpc(*),label
31 integer ipompc(*),nodempc(3,*),irefnode,irotnode,idir,
32 & nmpc,index,ii,inode,node,id,ikboun(*),ilboun(*),nboun,
33 & i,j,k,idof,na,nb,nc,np,i1,i2,i3,iaux(*),maxlenmpc,n,
34 & l,m,lmax,mmax,ikmpc(*),ilmpc(*),icascade,neigh(7,8),
35 & mpc,kon(*),ipkon(*),indexe,ne,idofrem,idofins,nmpc0,nmpc01,
36 & newstep,iit,idiscon,ncont,iexpnode,indexexp,nmpcdif,ntrans,
37 & nodei,noded,lathyp(3,6),inum,ndir,number,ithermal,mi(*),
38 & newknot,indexexp1,indexexp2,indexexp3,idim,nodea,nodeb,
41 real*8 co(3,*),coefmpc(*),vold(0:mi(2),*),c(3,3),dc(3,3,3),ww,
42 & e(3,3,3),d(3,3),w(3),f(3,3),
c1,c2,c3,c4,c5,c6,xbounact(*),
43 & xboun(*),fmpc(*),expan,dd,
a11,a12,a13,
a21,a22,a23,
a31,a32,a33,
44 & b11,b12,b13,b21,b22,b23,b31,b32,b33,aux(*),const,e1(3),e2(3),
45 & ddmax,a(3,3),b(3,3),xj,xi,et,ze,xlag(3,20),xeul(3,20),t1(3),
46 & coloc(3,8),reltime,csab(7),trab(7,*),pd(3),pi(3),
e11(3,3),
47 & ad(3,3),ai(3,3),e22(3,3),e12(3,3),ru(3,3),ru1(3,3),
48 & ru2(3,3),ru3(3,3),u1(3,3),u2(3,3),u3(3,3),dcu(3,3,3),u(3,3),
49 & xi1,xi2,xi3,dco,dsi,dco2,dsi2,cj,ck,cl,dmax
51 data d /1.,0.,0.,0.,1.,0.,0.,0.,1./
52 data e /0.,0.,0.,0.,0.,-1.,0.,1.,0.,
53 & 0.,0.,1.,0.,0.,0.,-1.,0.,0.,
54 & 0.,-1.,0.,1.,0.,0.,0.,0.,0./
55 data neigh /1,9,2,12,4,17,5,2,9,1,10,3,18,6,
56 & 3,11,4,10,2,19,7,4,11,3,12,1,20,8,
57 & 5,13,6,16,8,17,1,6,13,5,14,7,18,2,
58 & 7,15,8,14,6,19,3,8,15,7,16,5,20,4/
59 data coloc /-1.,-1.,-1.,1.,-1.,-1.,1.,1.,-1.,-1.,1.,-1.,
60 & -1.,-1.,1.,1.,-1.,1.,1.,1.,1.,-1.,1.,1./
64 data lathyp /1,2,3,1,3,2,2,1,3,2,3,1,3,1,2,3,2,1/
68 if((icascade.eq.1).and.(newstep.ne.1).and.(ncont.eq.0)) icascade=0
74 if(labmpc(ii)(1:5).eq.
'RIGID')
then 77 inode=nodempc(1,index)
81 index=nodempc(3,index)
82 irefnode=nodempc(1,index)
85 index=nodempc(3,index)
91 if(node.ne.irotnode)
then 96 ww=dsqrt(w(1)*w(1)+w(2)*w(2)+w(3)*w(3))
115 & c2*(e(i,1,j)*w(1)+e(i,2,j)*w(2)+e(i,3,j)*w(3))+
121 if(ww.gt.0.00464159)
then 122 c5=(ww*dcos(ww)-dsin(ww))/ww**3
126 if(ww.gt.0.0031623)
then 127 c6=(ww*dsin(ww)-2.d0+2.d0*dcos(ww))/ww**4
138 dc(i,j,k)=c4*w(k)*d(i,j)+
139 & c5*w(k)*(e(i,1,j)*w(1)+
140 & e(i,2,j)*w(2)+e(i,3,j)*w(3))+
143 & c3*(d(i,k)*w(j)+d(j,k)*w(i))
162 coefmpc(index)=dc(idir,1,1)*(co(1,irefnode)-co(1,inode))+
163 & dc(idir,2,1)*(co(2,irefnode)-co(2,inode))+
164 & dc(idir,3,1)*(co(3,irefnode)-co(3,inode))
166 index=nodempc(3,index)
167 coefmpc(index)=dc(idir,1,2)*(co(1,irefnode)-co(1,inode))+
168 & dc(idir,2,2)*(co(2,irefnode)-co(2,inode))+
169 & dc(idir,3,2)*(co(3,irefnode)-co(3,inode))
171 index=nodempc(3,index)
172 coefmpc(index)=dc(idir,1,3)*(co(1,irefnode)-co(1,inode))+
173 & dc(idir,2,3)*(co(2,irefnode)-co(2,inode))+
174 & dc(idir,3,3)*(co(3,irefnode)-co(3,inode))
178 index=nodempc(3,index)
183 vold(nodempc(2,index),nodempc(1,index))=0.d0
184 idof=8*(nodempc(1,index)-1)+nodempc(2,index)
185 call nident(ikboun,idof,nboun,id)
186 xbounact(ilboun(id))=f(idir,1)*(co(1,irefnode)-co(1,inode))+
187 & f(idir,2)*(co(2,irefnode)-co(2,inode))+
188 & f(idir,3)*(co(3,irefnode)-co(3,inode))-
189 & vold(idir,irefnode)+vold(idir,inode)
191 elseif(labmpc(ii)(1:4).eq.
'KNOT')
then 196 inode=nodempc(1,index)
197 idir=nodempc(2,index)
202 index=nodempc(3,index)
203 node=nodempc(1,index)
208 if(node.ne.irefnode)
then 215 read(labmpc(ii)(5:5),
'(i1)') idim
219 index=nodempc(3,index)
220 iexpnode=nodempc(1,index)
222 if((idim.eq.1).or.(idim.eq.3))
then 227 elseif(idim.eq.2)
then 232 index=nodempc(3,index)
235 index=nodempc(3,index)
241 if(newknot.eq.1)
then 242 if((idim.eq.1).or.(idim.eq.3))
then 243 expan=1.d0+vold(1,iexpnode)
244 elseif(idim.eq.2)
then 246 xi2=1.d0+vold(2,iexpnode)
247 xi3=1.d0+vold(3,iexpnode)
258 index=nodempc(3,index)
259 irotnode=nodempc(1,index)
261 if(newknot.eq.1)
then 262 w(1)=vold(1,irotnode)
263 w(2)=vold(2,irotnode)
264 w(3)=vold(3,irotnode)
265 ww=dsqrt(w(1)*w(1)+w(2)*w(2)+w(3)*w(3))
268 if(ww.gt.1.d-10)
then 284 & c2*(e(i,1,j)*w(1)+e(i,2,j)*w(2)+e(i,3,j)*w(3))+
290 if(ww.gt.0.00464159)
then 291 c5=(ww*dcos(ww)-dsin(ww))/ww**3
295 if(ww.gt.0.0031623)
then 296 c6=(ww*dsin(ww)-2.d0+2.d0*dcos(ww))/ww**4
307 dc(i,j,k)=c4*w(k)*d(i,j)+
308 & c5*w(k)*(e(i,1,j)*w(1)+
309 & e(i,2,j)*w(2)+e(i,3,j)*w(3))+
312 & c3*(d(i,k)*w(j)+d(j,k)*w(i))
317 if((idim.eq.1).or.(idim.eq.3))
then 323 f(i,j)=expan*c(i,j)-d(i,j)
333 dc(i,j,k)=dc(i,j,k)*expan
337 elseif(idim.eq.2)
then 345 e2(1)=t1(2)*e1(3)-t1(3)*e1(2)
346 e2(2)=t1(3)*e1(1)-t1(1)*e1(3)
347 e2(3)=t1(1)*e1(2)-t1(2)*e1(1)
353 e12(i,j)=e1(i)*e2(j)+e2(i)*e1(j)
356 & +((xi2*dco)**2+(xi3*dsi)**2)*
e11(i,j)
357 & +((xi2*dsi)**2+(xi3*dco)**2)*e22(i,j)
358 & +dd*dco*dsi*e12(i,j)
359 u1(i,j)=dd*(dco2*e12(i,j)
360 & -dsi2*(
e11(i,j)-e22(i,j)))
361 u2(i,j)=2.d0*xi2*(dco*dco*
e11(i,j)
362 & +dsi*dsi*e22(i,j))+xi2*dsi2*e12(i,j)
363 u3(i,j)=2.d0*xi3*(dsi*dsi*
e11(i,j)
364 & +dco*dco*e22(i,j))-xi3*dsi2*e12(i,j)
378 ru(i,j)=ru(i,j)+c(i,k)*u(k,j)
379 ru1(i,j)=ru1(i,j)+c(i,k)*u1(k,j)
380 ru2(i,j)=ru2(i,j)+c(i,k)*u2(k,j)
381 ru3(i,j)=ru3(i,j)+c(i,k)*u3(k,j)
383 f(i,j)=ru(i,j)-d(i,j)
394 dcu(i,j,k)=dcu(i,j,k)+dc(i,l,k)*u(l,j)
407 if((idim.eq.1).or.(idim.eq.3))
then 408 coefmpc(indexexp)=c(idir,1)*(co(1,irefnode)-co(1,inode))+
409 & c(idir,2)*(co(2,irefnode)-co(2,inode))+
410 & c(idir,3)*(co(3,irefnode)-co(3,inode))
411 elseif(idim.eq.2)
then 416 if(dabs(xi2-xi3).lt.1.d-10)
then 417 coefmpc(indexexp1)=0.d0
419 if(icascade.lt.1) icascade=1
420 nodempc(2,indexexp1)=2
423 coefmpc(indexexp1)=ru1(idir,1)*
424 & (co(1,irefnode)-co(1,inode))+
425 & ru1(idir,2)*(co(2,irefnode)-co(2,inode))+
426 & ru1(idir,3)*(co(3,irefnode)-co(3,inode))
428 if(icascade.lt.1) icascade=1
429 nodempc(2,indexexp1)=1
432 coefmpc(indexexp2)=ru2(idir,1)*
433 & (co(1,irefnode)-co(1,inode))+
434 & ru2(idir,2)*(co(2,irefnode)-co(2,inode))+
435 & ru2(idir,3)*(co(3,irefnode)-co(3,inode))
436 coefmpc(indexexp3)=ru3(idir,1)*
437 & (co(1,irefnode)-co(1,inode))+
438 & ru3(idir,2)*(co(2,irefnode)-co(2,inode))+
439 & ru3(idir,3)*(co(3,irefnode)-co(3,inode))
445 coefmpc(index)=(dc(idir,1,1)*(co(1,irefnode)-co(1,inode))+
446 & dc(idir,2,1)*(co(2,irefnode)-co(2,inode))+
447 & dc(idir,3,1)*(co(3,irefnode)-co(3,inode)))
449 index=nodempc(3,index)
450 coefmpc(index)=(dc(idir,1,2)*(co(1,irefnode)-co(1,inode))+
451 & dc(idir,2,2)*(co(2,irefnode)-co(2,inode))+
452 & dc(idir,3,2)*(co(3,irefnode)-co(3,inode)))
454 index=nodempc(3,index)
455 coefmpc(index)=(dc(idir,1,3)*(co(1,irefnode)-co(1,inode))+
456 & dc(idir,2,3)*(co(2,irefnode)-co(2,inode))+
457 & dc(idir,3,3)*(co(3,irefnode)-co(3,inode)))
461 index=nodempc(3,index)
466 vold(nodempc(2,index),nodempc(1,index))=0.d0
467 idof=8*(nodempc(1,index)-1)+nodempc(2,index)
468 call nident(ikboun,idof,nboun,id)
469 xbounact(ilboun(id))=f(idir,1)*(co(1,irefnode)-co(1,inode))+
470 & f(idir,2)*(co(2,irefnode)-co(2,inode))+
471 & f(idir,3)*(co(3,irefnode)-co(3,inode))-
472 & vold(idir,irefnode)+vold(idir,inode)
474 elseif(labmpc(ii)(1:8).eq.
'STRAIGHT')
then 481 index=nodempc(3,index)
483 index=nodempc(3,index)
485 index=nodempc(3,nodempc(3,index))
491 c2=co(i,na)+vold(i,na)-co(i,nb)-vold(i,nb)
492 if(dabs(c2).lt.1.d-5)
then 493 write(*,*)
'*WARNING in nonlinmpc: coefficient of' 495 &
' dependent node in STRAIGHT MPC is zero' 508 dd=dabs(co(l,na)+vold(l,na)-co(l,nb)-vold(l,nb))
523 index=nodempc(3,index)
525 index=nodempc(3,index)
527 index=nodempc(3,index)
529 index=nodempc(3,index)
531 index=nodempc(3,index)
533 index=nodempc(3,index)
535 if(icascade.eq.0) icascade=1
536 c2=co(i,na)+vold(i,na)-co(i,nb)-vold(i,nb)
539 index=nodempc(3,index)
540 c3=co(j,nb)+vold(j,nb)-co(j,na)-vold(j,na)
542 index=nodempc(3,index)
543 c5=co(i,nb)+vold(i,nb)-co(i,np)-vold(i,np)
545 index=nodempc(3,index)
546 c6=co(j,np)+vold(j,np)-co(j,nb)-vold(j,nb)
548 index=nodempc(3,index)
549 c4=co(i,np)+vold(i,np)-co(i,na)-vold(i,na)
551 index=nodempc(3,index)
552 c1=co(j,na)+vold(j,na)-co(j,np)-vold(j,np)
554 index=nodempc(3,index)
562 idof=8*(nodempc(1,index)-1)+nodempc(2,index)
563 call nident(ikboun,idof,nboun,id)
564 xbounact(ilboun(id))=-
c1*c2+c3*c4
565 if(newstep.eq.1) xboun(ilboun(id))=xbounact(ilboun(id))
566 vold(nodempc(2,index),nodempc(1,index))=
567 & (1.d0-reltime)*xboun(ilboun(id))
568 elseif(labmpc(ii)(1:5).eq.
'PLANE')
then 575 index=nodempc(3,index)
577 index=nodempc(3,index)
579 index=nodempc(3,index)
581 index=nodempc(3,nodempc(3,nodempc(3,index)))
583 index=nodempc(3,nodempc(3,nodempc(3,index)))
588 a11=co(i1,np)+vold(i1,np)-co(i1,nc)-vold(i1,nc)
589 a12=co(i2,np)+vold(i2,np)-co(i2,nc)-vold(i2,nc)
590 a13=co(i3,np)+vold(i3,np)-co(i3,nc)-vold(i3,nc)
591 a21=co(i1,na)+vold(i1,na)-co(i1,nc)-vold(i1,nc)
592 a22=co(i2,na)+vold(i2,na)-co(i2,nc)-vold(i2,nc)
593 a23=co(i3,na)+vold(i3,na)-co(i3,nc)-vold(i3,nc)
594 a31=co(i1,nb)+vold(i1,nb)-co(i1,nc)-vold(i1,nc)
595 a32=co(i2,nb)+vold(i2,nb)-co(i2,nc)-vold(i2,nc)
596 a33=co(i3,nb)+vold(i3,nb)-co(i3,nc)-vold(i3,nc)
609 if(dabs(b11).lt.1.d-5)
then 610 write(*,*)
'*WARNING in nonlinmpc: coefficient of' 611 write(*,*)
' dependent node in PLANE MPC is zero' 613 idofrem=8*(nodempc(1,index)-1)+i1
615 if(dabs(b12).gt.dabs(b13))
then 616 idofins=8*(nodempc(1,index)-1)+i2
618 & (ikmpc,ilmpc,nmpc,ii,idofrem,idofins)
621 index=nodempc(3,index)
624 index=nodempc(3,index)
626 index=nodempc(3,index)
629 index=nodempc(3,index)
632 index=nodempc(3,index)
634 index=nodempc(3,index)
637 index=nodempc(3,index)
640 index=nodempc(3,index)
642 index=nodempc(3,index)
643 coefmpc(index)=-b12-b22-b32
645 index=nodempc(3,index)
646 coefmpc(index)=-b11-b21-b31
648 index=nodempc(3,index)
649 coefmpc(index)=-b13-b23-b33
650 if(icascade.eq.0) icascade=1
652 idofins=8*(nodempc(1,index)-1)+i3
654 & (ikmpc,ilmpc,nmpc,ii,idofrem,idofins)
657 index=nodempc(3,index)
659 index=nodempc(3,index)
662 index=nodempc(3,index)
665 index=nodempc(3,index)
667 index=nodempc(3,index)
670 index=nodempc(3,index)
673 index=nodempc(3,index)
675 index=nodempc(3,index)
678 index=nodempc(3,index)
679 coefmpc(index)=-b13-b23-b33
681 index=nodempc(3,index)
682 coefmpc(index)=-b12-b22-b32
683 index=nodempc(3,index)
684 coefmpc(index)=-b11-b21-b31
686 if(icascade.eq.0) icascade=1
690 index=nodempc(3,index)
692 index=nodempc(3,index)
694 index=nodempc(3,index)
696 index=nodempc(3,index)
698 index=nodempc(3,index)
700 index=nodempc(3,index)
702 index=nodempc(3,index)
704 index=nodempc(3,index)
706 index=nodempc(3,index)
707 coefmpc(index)=-b11-b21-b31
708 index=nodempc(3,index)
709 coefmpc(index)=-b12-b22-b32
710 index=nodempc(3,index)
711 coefmpc(index)=-b13-b23-b33
713 index=nodempc(3,index)
715 idof=8*(nodempc(1,index)-1)+nodempc(2,index)
719 call nident(ikboun,idof,nboun,id)
720 xbounact(ilboun(id))=
a11*b11+a12*b12+a13*b13
721 if(newstep.eq.1) xboun(ilboun(id))=xbounact(ilboun(id))
722 vold(nodempc(2,index),nodempc(1,index))=0.d0
723 elseif(labmpc(ii)(1:4).eq.
'BEAM')
then 725 nodea=nodempc(1,index)
726 idira=nodempc(2,index)
727 nodeb=nodempc(1,nodempc(3,nodempc(3,nodempc(3,index))))
731 dmax=dabs(co(1,nodea)+vold(1,nodea)
732 & -co(1,nodeb)-vold(1,nodeb))
735 dd=dabs(co(j,nodea)+vold(j,nodea)
736 & -co(j,nodeb)-vold(j,nodeb))
745 if(jmax.ne.idira)
then 746 write(*,*)
'*WARNING in nonlinmpc: dependent dof',idira
747 write(*,*)
' in a BEAM MPC is not maximum; it' 748 write(*,*)
' will be changed to dof ',jmax
749 write(*,*)
' which corresponds to the maximum' 750 write(*,*)
' coefficient' 751 idofrem=8*(nodea-1)+idira
752 idofins=8*(nodea-1)+jmax
762 index=nodempc(3,index)
764 index=nodempc(3,index)
766 index=nodempc(3,index)
768 index=nodempc(3,index)
770 index=nodempc(3,index)
772 index=nodempc(3,index)
777 cj=2.d0*(co(j,nodea)+vold(j,nodea)
778 & -co(j,nodeb)-vold(j,nodeb))
780 index=nodempc(3,index)
783 ck=2.d0*(co(k,nodea)+vold(k,nodea)
784 & -co(k,nodeb)-vold(k,nodeb))
786 index=nodempc(3,index)
789 cl=2.d0*(co(l,nodea)+vold(l,nodea)
790 & -co(l,nodeb)-vold(l,nodeb))
792 index=nodempc(3,index)
795 index=nodempc(3,index)
798 index=nodempc(3,index)
801 index=nodempc(3,index)
805 idof=8*(nodempc(1,index)-1)+nodempc(2,index)
806 call nident(ikboun,idof,nboun,id)
807 xbounact(ilboun(id))=(cj**2+ck**2+cl**2)/4.d0
808 & -(co(1,nodea)-co(1,nodeb))**2
809 & -(co(2,nodea)-co(2,nodeb))**2
810 & -(co(3,nodea)-co(3,nodeb))**2
812 if(newstep.eq.1) xboun(ilboun(id))=xbounact(ilboun(id))
813 vold(nodempc(2,index),nodempc(1,index))=0.d0
814 elseif((labmpc(ii)(1:20).ne.
' ').and.
815 & (labmpc(ii)(1:10).ne.
'PRETENSION').and.
816 & (labmpc(ii)(1:11).ne.
'THERMALPRET').and.
818 & (labmpc(ii)(1:7).ne.
'NETWORK').and.
819 & (labmpc(ii)(1:5).ne.
'FLUID').and.
820 & (labmpc(ii)(1:6).ne.
'CYCLIC').and.
821 & (labmpc(ii)(1:14).ne.
'ROTTRACOUPLING').and.
822 & (labmpc(ii)(1:9).ne.
'SUBCYCLIC'))
then 827 node=nodempc(1,index)
829 iaux(i)=nodempc(2,index)
830 iaux(maxlenmpc+i)=node
831 aux(6*maxlenmpc+i)=coefmpc(index)
833 aux(3*(i-1)+j)=co(j,node)
834 aux(3*(maxlenmpc+i-1)+j)=vold(j,node)
836 index=nodempc(3,index)
839 if((labmpc(ii)(1:7).eq.
'MEANROT').or.
840 & (labmpc(ii)(1:1).eq.
'1'))
then 842 & aux(6*maxlenmpc+1),iaux,n,fmpc(ii),iit,idiscon,
843 & iaux(maxlenmpc+1),ikmpc,nmpc,ikboun,nboun,
845 elseif(labmpc(ii)(1:4).eq.
'DIST')
then 846 call umpc_dist(aux,aux(3*maxlenmpc+1),const,
847 & aux(6*maxlenmpc+1),iaux,n,fmpc(ii),iit,idiscon)
848 elseif(labmpc(ii)(1:4).eq.
'USER')
then 849 call umpc_user(aux,aux(3*maxlenmpc+1),const,
850 & aux(6*maxlenmpc+1),iaux,n,fmpc(ii),iit,idiscon)
852 write(*,*)
'*ERROR in nonlinmpc: mpc of type ',labmpc(ii)
853 write(*,*)
' is unknown' 858 if((iaux(1).ne.nodempc(2,index)).or.
859 & (iaux(maxlenmpc+1).ne.nodempc(1,index)))
then 863 idofrem=8*(nodempc(1,index)-1)+nodempc(2,index)
864 idofins=8*(nodempc(1,index)-1)+iaux(1)
866 if(icascade.eq.0) icascade=1
878 if(iaux(i).ne.nodempc(2,index))
then 879 if(icascade.eq.0) icascade=1
881 nodempc(2,index)=iaux(i)
882 coefmpc(index)=aux(6*maxlenmpc+i)
888 vold(nodempc(2,index),nodempc(1,index))=0.d0
889 idof=8*(nodempc(1,index)-1)+nodempc(2,index)
890 call nident(ikboun,idof,nboun,id)
891 xbounact(ilboun(id))=const
893 index=nodempc(3,index)
subroutine umpc_user(x, u, f, a, jdof, n, force, iit, idiscon)
Definition: umpc_user.f:20
subroutine changedepterm(ikmpc, ilmpc, nmpc, mpc, idofrem, idofins)
Definition: changedepterm.f:20
subroutine umpc_mean_rot(x, u, f, a, jdof, n, force, iit, idiscon, jnode, ikmpc, nmpc, ikboun, nboun, label)
Definition: umpc_mean_rot.f:21
static double * a31
Definition: mafillkmain.c:30
static double * c1
Definition: mafillvcompmain.c:30
static double * a21
Definition: mafillkmain.c:30
subroutine umpc_dist(x, u, f, a, jdof, n, force, iit, idiscon)
Definition: umpc_dist.f:20
subroutine nident(x, px, n, id)
Definition: nident.f:26
static double * a11
Definition: mafillkmain.c:30
static double * e11
Definition: radflowload.c:42