impo31
C IMPO31 SOURCE PV 20/04/01 21:15:40 10569 C Operateur 'IMPO' 'MAIL' ( | 'SYME' | ) Surf1 Surf2 ( Crit) ; C 3D | 'MESC' | C | 'FAIB' | SUBROUTINE IMPO31 * * modif octobre 2012 on ne cree pas les noeuds support des mult ici * on le fera dynamiquement dans impo32 * * Et en decembre 2015 on affaiblit la formulation en regroupant les multiplicateurs de lagrange par element * ce qui rend inutile le developpement precedent * IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMELEME -INC CCGEOME segment lagran(nbpts) SEGMENT IAUXTB(NBAUX) PARAMETER ( X1s4 = 0.25000000000000000000000000000000000000000D0 , & X1s6 = 0.16666666666666666666666666666666666666667D0 ) * LOGICAL faible PARAMETER (ncle = 3) CHARACTER*4 mcle(ncle) DATA mcle / 'MESC','FAIB','SYME' / * idimp1 = IDIM + 1 lagran = 0 * * Lecture d'un mot-cle eventuel : SYME(trique) ou MESC ou FAIB(le) * mesc = 0 if (ierr.ne.0) return * * Lecture des deux surfaces en contact * if (ierr.ne.0) return if (ierr.ne.0) return * * Lecture eventuelle de la distance limite max(crit) * if (ierr.ne.0) return * crit = abs(crit) *D write(ioimp,*) ' critere ',crit,cri2 * * Lecture eventuelle de la distance limite min(critmin) * critmin = 0.d0 if (ierr.ne.0) return crimi2 = critmin*critmin * crit = abs(crit) *D write(ioimp,*) ' critere ',crit,cri2 * * Activation et quelques verifications sur les maillages des surfaces * segact ipt1,ipt2 if (ierr.ne.0) goto 900 * segact mcoord*mod nbpts0 = nbpts * nel1 = ipt1.num(/2) nel2 = ipt2.num(/2) * noe1 = ipt1.num(/1) noe2 = ipt2.num(/1) * En fait : noe1 = noe2 = 3 car elements de type TRI3 ! * * Increment sur le nombre d'elements de contact retenus pour agrandir * les longueurs des segments (maillage, mcoord) de maniere adequate incnel = 100000 * faible = mesc.eq.2 if (mesc .ne. 1) mesc = 0 * creation si il y a lieu du point support des multiplicateurs de lagrange non instanciées if (ilgni.eq.0) then nbpts = nbpts0 +1 nbpts0 = nbpts segadj,mcoord ilgni = nbpts endif * *----------------------------------------------------------------------- *- FORMULATION "STANDARD" DU CONTACT - *----------------------------------------------------------------------- IF (faible) GOTO 500 * * Changement decembre 2015 on ne créé qu'une seule relation par noeud * en sommant les contributions des éléments en visàvis * * Creation lagran qui contient le mult associe au noeud * if (lagran.eq.0) segini lagran * * * Nombre de points supports (multiplicateurs de Lagrange) associes * au contact (1 par noeud de contact) * Ajustement du segment mcoord * nbpts = nbpts0 + (incnel * 1) * segadj,mcoord * * tableau auxiliaire pour accelerer le test element deja cree * nbaux = nbpts0 * * Creation du maillage de contact (meleme) * nbsous = 0 nbref = 0 nbnn = 5 nbelem = incnel segini,meleme itypel = 22 * nblag = nbpts0 nbcoo = (nblag-1)*idimp1 nbelc = 0 nbpts = nbpts + nel1 segadj,mcoord * ipas = 1 * 5 continue segini iauxtb * * Boucle sur les elements de la 1ere surface de contact * do 10 iel=1,nel1 nbeini = nbelc ip1 = ipt1.num(1,iel) ip2 = ipt1.num(2,iel) ip3 = ipt1.num(3,iel) ipv = (ip1-1)*idimp1 xp1 = xcoor(ipv+1) yp1 = xcoor(ipv+2) zp1 = xcoor(ipv+3) ipv = (ip2-1)*idimp1 xp2 = xcoor(ipv+1) yp2 = xcoor(ipv+2) zp2 = xcoor(ipv+3) ipv = (ip3-1)*idimp1 xp3 = xcoor(ipv+1) yp3 = xcoor(ipv+2) zp3 = xcoor(ipv+3) xg1 = xp1+xp2+xp3 yg1 = yp1+yp2+yp3 zg1 = zp1+zp2+zp3 * * Boucle sur les noeuds de la 2eme surface de contact * do 21 jel=1,nel2 do 20 jnn=1,noe2 jp=ipt2.num(jnn,jel) * verification que pas relation du point sur lui meme if (jp.eq.ip1) goto 20 if (jp.eq.ip2) goto 20 if (jp.eq.ip3) goto 20 * verification que pas deja la relation if (iauxtb(jp).eq.iel) goto 20 iauxtb(jp) = iel ipv = (jp-1)*idimp1 xp=xcoor(ipv+1) yp=xcoor(ipv+2) zp=xcoor(ipv+3) * test distance d1=(xp1-xp)**2+(yp1-yp)**2+(zp1-zp)**2 if (d1.le.cri2.and.d1.ge.crimi2) goto 22 d1=(xp2-xp)**2+(yp2-yp)**2+(zp2-zp)**2 if (d1.le.cri2.and.d1.ge.crimi2) goto 22 d1=(xp3-xp)**2+(yp3-yp)**2+(zp3-zp)**2 if (d1.le.cri2.and.d1.ge.crimi2) goto 22 goto 20 * 22 continue * * Mise a jour de la dimension des segments si necessaire * if (nbelc.eq.nbelem) then incnel = incnel * 2 nbelem = nbelem + incnel if (iimpi.ne.0) write(ioimp,*) ' ajustement impo31 ',nbelem segadj,meleme endif * * on incremente mcoord avec le pt support du multiplicateur si il y a lieu * on range dans le meleme l'element de contact associe * if (lagran(jp).eq.0) then nblag = nblag + 1 nbcoo = nbcoo + idimp1 xcoor(nbcoo+1) = xp xcoor(nbcoo+2) = yp xcoor(nbcoo+2) = zp xcoor(nbcoo+3) = 0.d0 lagran(jp)=nblag endif * * on range dans le meleme * nbelc = nbelc + 1 num(1,nbelc) = lagran(jp) num(2,nbelc) = ip1 num(3,nbelc) = ip2 num(4,nbelc) = ip3 num(5,nbelc) = jp * 20 continue 21 continue * 10 continue segsup iauxtb * * On recommence en inversant les deux surfaces en cas de traitement * symetrique du contact (option MESC non activee) * if (ipas.eq.1.and.mesc.ne.1) then ipas=ipas+1 iaux=ipt1 ipt1=ipt2 ipt2=iaux nel1 = ipt1.num(/2) nel2 = ipt2.num(/2) noe2 = ipt2.num(/1) goto 5 endif segsup lagran * GOTO 1000 * *----------------------------------------------------------------------- *- FORMULATION "FAIBLE" DU CONTACT - *----------------------------------------------------------------------- 500 CONTINUE * * Le nb d'elements maximal a creer pour le maillage de contact FAIBLE : * 1 entre chaque element de chacune des surfaces * * Creation du maillage de contact (meleme) * nbnn = 7 nbsous = 0 nbref = 0 nbelem = incnel segini,meleme itypel = 22 * * Nombre de points supports (multiplicateurs de Lagrange) associes * au contact : 1 par element de contact * Ajustement du segment mcoord * nbpts = nbpts0 + nel1 segadj,mcoord * nblag = nbpts0 nbcoo = (nblag-1)*idimp1 nbelc = 0 * * Boucle sur les elements du maillage de la 1ere surface de contact * do 510 iel = 1, nel1 ip1 = ipt1.num(1,iel) ip2 = ipt1.num(2,iel) ip3 = ipt1.num(3,iel) ipv = (ip1-1)*idimp1 xp1 = xcoor(ipv+1) yp1 = xcoor(ipv+2) zp1 = xcoor(ipv+3) ipv = (ip2-1)*idimp1 xp2 = xcoor(ipv+1) yp2 = xcoor(ipv+2) zp2 = xcoor(ipv+3) ipv = (ip3-1)*idimp1 xp3 = xcoor(ipv+1) yp3 = xcoor(ipv+2) zp3 = xcoor(ipv+3) xg1 = xp1 + xp2 + xp3 yg1 = yp1 + yp2 + yp3 zg1 = zp1 + zp2 + zp3 * * on incremente mcoord avec le pt support des multiplicateurs * nblag = nblag + 1 nbcoo = nbcoo + idimp1 * xcoor(nbcoo+1) = (xg1) /3 xcoor(nbcoo+2) = (yg1) /3 xcoor(nbcoo+3) = (zg1) /3 xcoor(nbcoo+4) = 0. * * Boucle sur les elements du maillage de la 2e surface de contact * do 520 jel = 1, nel2 jp1 = ipt2.num(1,jel) jp2 = ipt2.num(2,jel) jp3 = ipt2.num(3,jel) ipv = (jp1-1)*idimp1 xp4 = xcoor(ipv+1) yp4 = xcoor(ipv+2) zp4 = xcoor(ipv+3) ipv = (jp2-1)*idimp1 xp5 = xcoor(ipv+1) yp5 = xcoor(ipv+2) zp5 = xcoor(ipv+3) ipv = (jp3-1)*idimp1 xp6 = xcoor(ipv+1) yp6 = xcoor(ipv+2) zp6 = xcoor(ipv+3) * test distance d1 = (xp1-xp4)**2+(yp1-yp4)**2+(zp1-zp4)**2 d2 = (xp2-xp4)**2+(yp2-yp4)**2+(zp2-zp4)**2 d3 = (xp3-xp4)**2+(yp3-yp4)**2+(zp3-zp4)**2 if ((d1.le.cri2.or.d2.le.cri2.or.d3.le.cri2).and. > (d1.ge.crimi2.or.d2.ge.crimi2.or.d3.ge.crimi2)) goto 550 d1 = (xp1-xp5)**2+(yp1-yp5)**2+(zp1-zp5)**2 d2 = (xp2-xp5)**2+(yp2-yp5)**2+(zp2-zp5)**2 d3 = (xp3-xp5)**2+(yp3-yp5)**2+(zp3-zp5)**2 if ((d1.le.cri2.or.d2.le.cri2.or.d3.le.cri2).and. > (d1.ge.crimi2.or.d2.ge.crimi2.or.d3.ge.crimi2)) goto 550 d1 = (xp1-xp6)**2+(yp1-yp6)**2+(zp1-zp6)**2 d2 = (xp2-xp6)**2+(yp2-yp6)**2+(zp2-zp6)**2 d3 = (xp3-xp6)**2+(yp3-yp6)**2+(zp3-zp6)**2 if ((d1.le.cri2.or.d2.le.cri2.or.d3.le.cri2).and. > (d1.ge.crimi2.or.d2.ge.crimi2.or.d3.ge.crimi2)) goto 550 goto 520 * 550 continue * * Mise a jour de la dimension des segments si necessaire * nbelc=nbelc+1 if (nbelc.eq.nbelem) then nbelem = nbelem + incnel segadj,meleme endif * * on range dans le meleme * num(1,nbelc) = nblag num(2,nbelc) = ip1 num(3,nbelc) = ip2 num(4,nbelc) = ip3 num(5,nbelc) = jp1 num(6,nbelc) = jp3 num(7,nbelc) = jp2 * on note la formulation dans icolor icolor(nbelc)=1 * 520 continue * 510 continue * * GOTO 1000 * *----------------------------------------------------------------------- * FIN : *----------------------------------------------------------------------- 1000 CONTINUE *D write(ioimp,*) ' nbpts nbpts0 nblag',nbpts,nbpts0,nblag *D write(ioimp,*) ' nbelem nbelc',nbelem,nbelc * * On renvoie le resultat mais au prealable on ajuste les longueurs * if (nbelem.lt.nbelc) then segsup,meleme goto 900 else if (nbelem.gt.nbelc) then nbelem = nbelc segadj,meleme nbpts = nblag segadj,mcoord endif segdes,meleme 900 CONTINUE segdes,ipt1,ipt2 return end
© Cast3M 2003 - Tous droits réservés.
Mentions légales