28 character*1 typeboun(*)
29 character*20 labmpc(*),label
31 integer ipompc(*),nodempc(3,*),nmpc,nmpc_,mpcfree,nk,nk_,
32 & ikmpc(*),idir,indexmax,indexold(3),indexnew(3),nodeold,nodemax,
33 & ilmpc(*),node,id,mpcfreeold,idof,l,nodeboun(*),iperturb(2),
34 & ndirboun(*),ikboun(*),ilboun(*),nboun,nboun_,nnodes,nodevector,
35 & index,index1,node1,i,j,nkn,idirold,idirmax,noderef,idirref,
38 real*8 coefmpc(*),co(3,*),aa(3),dd,cgx(3),pi(3),
c1,c4,c9,
39 & c10,amax,xcoef,transcoef(3),xboun(*)
45 if((label(1:7).ne.
'MEANROT').and.
46 & (label(1:1).ne.
'1'))
then 53 call nident(ikmpc,idof,nmpc,id)
55 if(ikmpc(id).eq.idof)
then 56 write(*,*)
'*WARNING in usermpc: DOF for node ',node
57 write(*,*)
' in direction 1 has been used' 59 &
' on the dependent side of another' 60 write(*,*)
' MPC. ',label
61 write(*,*)
' constraint cannot be applied' 68 if(nmpc.gt.nmpc_)
then 69 write(*,*)
'*ERROR in usermpc: increase nmpc_' 79 if((label(1:7).ne.
'MEANROT').and.
80 & (label(1:1).ne.
'1'))
then 92 nodempc(1,mpcfree)=node
98 if((labmpc(nmpc)(1:7).eq.
'MEANROT').or.
99 & (labmpc(nmpc)(1:1).eq.
'1'))
then 101 labmpc(nmpc)(1:7)=
'MEANROT' 109 coefmpc(mpcfree)=0.d0
110 mpcfree=nodempc(3,mpcfree)
120 write(*,*)
'*ERROR in usermpc: increase nk_' 124 nodempc(1,mpcfree)=nk
127 coefmpc(mpcfree)=1.d0
130 mpcfree=nodempc(3,mpcfree)
131 nodempc(3,mpcfreeold)=0
133 call nident(ikboun,idof,nboun,id)
135 if(nboun.gt.nboun_)
then 136 write(*,*)
'*ERROR in usermpc: increase nboun_' 144 ikboun(l)=ikboun(l-1)
145 ilboun(l)=ilboun(l-1)
152 if((labmpc(nmpc)(1:7).eq.
'MEANROT').or.
153 & (labmpc(nmpc)(1:1).eq.
'1'))
then 155 if(3*nkn.ne.nnodes-1)
then 157 &
'*ERROR in usermpc: MPC has wrong number of terms' 165 aa(i)=co(i,nodevector)
169 if(dd.lt.1.d-10)
then 171 &
'*ERROR in usermpc: rotation vector has zero length' 187 node=nodempc(1,index)
188 if(node.eq.nodevector)
exit 190 cgx(j)=cgx(j)+co(j,node)
192 index=nodempc(3,nodempc(3,nodempc(3,index)))
205 node=nodempc(1,index)
206 if(node.eq.nodevector)
exit 211 pi(j)=co(j,node)-cgx(j)
216 c1=pi(1)*aa(1)+pi(2)*aa(2)+pi(3)*aa(3)
221 c1=pi(1)*pi(1)+pi(2)*pi(2)+pi(3)*pi(3)
222 if(
c1.lt.1.d-20)
then 223 if(label(8:9).ne.
'BS')
then 224 write(*,*)
'*WARNING in usermpc: node ',node
225 write(*,*)
' is very close to the ' 226 write(*,*)
' rotation axis through the' 227 write(*,*)
' center of gravity of' 228 write(*,*)
' the nodal cloud in a' 229 write(*,*)
' mean rotation MPC.' 230 write(*,*)
' This node is not taken' 231 write(*,*)
' into account in the MPC' 233 index=nodempc(3,nodempc(3,nodempc(3,index)))
239 c4=aa(2)*pi(3)-aa(3)*pi(2)
241 c4=aa(3)*pi(1)-aa(1)*pi(3)
243 c4=aa(1)*pi(2)-aa(2)*pi(1)
249 node1=nodempc(1,index1)
250 if(node1.eq.nodevector)
exit 251 if(node1.eq.node)
then 252 c10=c9*(1.d0-1.d0/
real(nkn))
257 coefmpc(index1)=coefmpc(index1)+c10
259 coefmpc(nodempc(3,index1))=
260 & coefmpc(nodempc(3,index1))+c10
262 coefmpc(nodempc(3,nodempc(3,index1)))=
263 & coefmpc(nodempc(3,nodempc(3,index1)))+c10
265 index1=nodempc(3,nodempc(3,nodempc(3,index1)))
268 index=nodempc(3,nodempc(3,nodempc(3,index)))
280 index=nodempc(3,index)
281 if(nodempc(3,index).eq.0)
exit 295 if(label(8:9).eq.
'BS')
then 298 index=nodempc(3,index)
301 transcoef(i)=coefmpc(index)
302 index=nodempc(3,index)
312 if(label(8:9).eq.
'BS')
then 318 if(dabs(coefmpc(index)).gt.amax)
then 319 idir=nodempc(2,index)
327 if(label(8:9).eq.
'BS')
then 328 if(coefmpc(index)*transcoef(idir).gt.0)
then 329 index=nodempc(3,index)
334 node=nodempc(1,index)
339 call nident(ikmpc,idof,nmpc-1,id)
341 if(ikmpc(id).eq.idof)
then 342 index=nodempc(3,index)
349 call nident(ikboun,idof,nboun,id)
351 if(ikboun(id).eq.idof)
then 352 index=nodempc(3,index)
357 amax=dabs(coefmpc(index))
366 if((i/3)*3.eq.i)
then 367 if(indexmax.ne.0)
exit 370 index=nodempc(3,index)
373 if(indexmax.eq.0)
then 374 if(idirref.ne.0)
then 375 write(*,*)
'*WARNING in usermpc: no MPC is ' 376 write(*,*)
' generated for the mean' 377 write(*,*)
' rotation in node ',noderef
378 write(*,*)
' and direction ',idirref+3
380 write(*,*)
'*WARNING in usermpc: no MPC is ' 381 write(*,*)
' generated for the mean' 382 write(*,*)
' rotation definition starting ' 383 write(*,*)
' with node ',noderef
399 if(nodempc(3,index).ne.0)
then 400 index=nodempc(3,index)
402 nodempc(3,index)=mpcfreeold
418 nodemax=nodempc(1,indexmax)
419 idirmax=nodempc(2,indexmax)
422 nodeold=nodempc(1,index)
423 idirold=nodempc(2,index)
427 if(nodemax.ne.nodeold)
then 430 indexold(2)=nodempc(3,index)
431 indexold(3)=nodempc(3,indexold(2))
433 index=nodempc(3,indexold(3))
435 if(nodempc(1,index).eq.nodevector)
exit 436 if(nodempc(1,index).eq.nodemax)
then 437 if(nodempc(2,index).eq.1)
then 439 elseif(nodempc(2,index).eq.2)
then 445 index=nodempc(3,index)
449 node=nodempc(1,indexold(j))
450 idir=nodempc(2,indexold(j))
451 xcoef=coefmpc(indexold(j))
452 nodempc(1,indexold(j))=nodempc(1,indexnew(j))
453 nodempc(2,indexold(j))=nodempc(2,indexnew(j))
454 coefmpc(indexold(j))=coefmpc(indexnew(j))
455 nodempc(1,indexnew(j))=node
456 nodempc(2,indexnew(j))=idir
457 coefmpc(indexnew(j))=xcoef
464 if(idirmax.ne.1)
then 466 if(idirmax.eq.2)
then 467 indexnew(1)=nodempc(3,index)
469 indexnew(1)=nodempc(3,nodempc(3,index))
473 idir=nodempc(2,indexold(j))
474 xcoef=coefmpc(indexold(j))
475 nodempc(2,indexold(j))=nodempc(2,indexnew(j))
476 coefmpc(indexold(j))=coefmpc(indexnew(j))
477 nodempc(2,indexnew(j))=idir
478 coefmpc(indexnew(j))=xcoef
484 idof=8*(nodemax-1)+idirmax
485 call nident(ikmpc,idof,nmpc-1,id)
493 elseif(labmpc(nmpc)(1:4).eq.
'DIST')
then 495 write(*,*)
'*INFO in usermpc: nonlinear geometric' 496 write(*,*)
' effects are turned on' 498 if(iperturb(1).eq.0) iperturb(1)=2
505 elseif(labmpc(nmpc)(1:4).eq.
'USER')
then 507 write(*,*)
'*INFO in usermpc: nonlinear geometric' 508 write(*,*)
' effects are turned on' 510 if(iperturb(1).eq.0) iperturb(1)=2
512 write(*,*)
'*ERROR in usermpc: mpc of type',labmpc(nmpc)
513 write(*,*)
' is unknown' static double * c1
Definition: mafillvcompmain.c:30
subroutine nident(x, px, n, id)
Definition: nident.f:26