impos8
C IMPOS8 SOURCE PV 20/03/24 21:18:05 10554 subroutine impos8 IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMELEME * SEGMENT icpr(nnoe) * PARAMETER ( X1s3 = 0.333333333333333333333333333333333333333333 , & X1s2 = 0.5 ) * character*4 mcle(1) data mcle /'ESCL'/ * * lecture des deux maillages : * 1er = ligne (MAITRE), 2eme = ligne ou point (ESCLAVE) * ipt1 = 0 ipt2 = 0 ippr = 0 icas = 1 * if (ierr.ne.0) return if (ire.eq.0) then return endif if (ierr.ne.0) return if (iretou.eq.0) then if (ierr.ne.0) return ipt2 = ippr endif * segact ipt1,ipt2 * nbel1 = ipt1.num(/2) nbno1 = ipt1.num(/1) nbel2 = ipt2.num(/2) nbno2 = ipt2.num(/1) * * Quelques verifications : if (ipt2.itypel.eq.1) then icas = 2 else endif if (ierr.ne.0) goto 9000 * * Quelques initialisations : idimp1 = idim+1 segact mcoord*mod nnoe = nbpts * nbeele = 0 nbepts = nnoe nbecoo = (nbepts-1) * idimp1 * * Branchement en fonction du cas a traiter (variable icas) : GOTO (1000,2000), icas goto 9000 * * -------- * icas = 1 -> MAITRE = ligne (SEG2), ESCLAVE = ligne (SEG2) * -------- * Remarque : nbno2 = nbno1 = 2 * 1000 CONTINUE * * estimation du nombre maximal d elements a creer * segini icpr do 100 i=1, nbel1 icpr(ipt1.num(1,i)) = 1 icpr(ipt1.num(2,i)) = 1 100 continue do 101 i=1,nbel2 ipv = ipt2.num(1,i) if (icpr(ipv).eq.1 .or. icpr(ipv).eq.3) then icpr(ipv) = 3 else icpr(ipv) = 2 endif ipv = ipt2.num(2,i) if (icpr(ipv).eq.1 .or. icpr(ipv).eq.3) then icpr(ipv) = 3 else icpr(ipv) = 2 endif 101 continue ipo1 = 0 ipo2 = 0 ipo3 = 0 do 102 i = 1, nnoe if (icpr(i).eq.1) then ipo1 = ipo1 + 1 elseif (icpr(i).eq.2) then ipo2 = ipo2 + 1 elseif (icpr(i).eq.3) then ipo3 = ipo3 + 1 endif 102 continue * ipo1m = ipo1 + ipo3 ipo2m = ipo2 + ipo3 nblag = ipo2m * nbel1 segsup icpr * * Creation du meleme associe a la relation * 1 point support a creer pour chaque element genere * nbelem = nblag nbnn = 4 nbsous = 0 nbref = 0 segini,meleme itypel=22 * nbpts = nnoe + nblag segadj mcoord * * Boucle sur les elements du 1er maillage (ligne maitre) * do 110 iel = 1, nbel1 * nbeini = nbeele * * 1er noeud maitre * ip1 = ipt1.num(1,iel) ipv = (ip1-1)*idimp1 xp1 = xcoor(ipv+1) yp1 = xcoor(ipv+2) * * 2eme noeud maitre dans * ip2 = ipt1.num(2,iel) ipv = (ip2-1)*idimp1 xp2 = xcoor(ipv+1) yp2 = xcoor(ipv+2) * * Boucle sur les points du 2eme maillage (ligne esclave) * do 120 jel = 1, nbel2 do 120 jno = 1, nbno2 * * noeud esclave * jp = ipt2.num(jno,jel) * * verification que pas relation du noeud esclave sur lui meme * if (jp.eq.ip1) goto 120 if (jp.eq.ip2) goto 120 * * verification que pas deja la relation * do 121 irela = nbeini+1, nbeele if (jp.eq.num(4,irela)) goto 120 121 continue * ipv = (jp-1) * idimp1 xp = xcoor(ipv+1) yp = xcoor(ipv+2) * * xcoor : points supports des mult. et rangement ds melem * nbeele = nbeele + 1 nbepts = nbepts + 1 nbecoo = nbecoo + idimp1 * xcoor(nbecoo+1) = (xp1+xp2+xp) * X1s3 xcoor(nbecoo+2) = (yp1+yp2+yp) * X1s3 xcoor(nbecoo+3) =0. num(1,nbeele) = nbepts num(2,nbeele) = ip1 num(3,nbeele) = ip2 num(4,nbeele) = jp * 120 continue * 110 continue * GOTO 3000 * * -------- * icas = 2 -> MAITRE = ligne (SEG2), ESCLAVE = 1 seul point * -------- * Remarque : nbno2 = 1, nbno1 = 2 * 2000 CONTINUE * * estimation du nombre maximal d elements a creer * nblag = nbel1 + 1 * * Creation du meleme associe a la relation * 1 point support a creer pour chaque element genere * nbelem = nblag nbnn = 3 nbsous = 0 nbref = 0 segini,meleme itypel = 22 * nbpts = nnoe + nblag segadj mcoord * * noeud esclave * jp = ipt2.num(1,1) ipv = (jp-1)*idimp1 xp = xcoor(ipv+1) yp = xcoor(ipv+2) * * Boucle sur les noeuds du 1er maillage (ligne maitre) * do 210 iel = 1, nbel1 + 1 * nbeini = nbeele * * 1er noeud maitre * if (iel.gt.nbel1) then ip1=ipt1.num(2,nbel1) else ip1=ipt1.num(1,iel) endif ipv = (ip1-1) * idimp1 * * verification que pas relation du noeud esclave sur lui meme if (jp.eq.ip1) goto 210 * * verification que pas deja la relation do 220 irela = nbeini+1,nbeele if (jp.eq.num(3,irela)) goto 210 220 continue * xp1 = xcoor(ipv+1) yp1 = xcoor(ipv+2) * * xcoor : points supports des mult. et rangement ds melem * nbeele = nbeele + 1 nbepts = nbepts + 1 nbecoo = nbecoo + idimp1 *$ xcoor(nbecoo+1) = (xp1+xp) * X1s2 xcoor(nbecoo+2) = (yp1+yp) * X1s2 xcoor(nbecoo+3) =0. * num(1,nbeele) = nbepts num(2,nbeele) = ip1 num(3,nbeele) = jp * 210 continue * * GOTO 3000 * * ----------------- * Fin du traitement * ----------------- 3000 CONTINUE * Ajustement au plus juste de meleme et mcoord if (nbelem.lt.nbeele) then segsup,meleme goto 9000 elseif (nbelem.gt.nbeele) then nbelem=nbeele segadj meleme nbpts = nbepts segadj mcoord endif segdes,meleme 9000 CONTINUE segdes,ipt1,ipt2 if (ippr.ne.0) segsup,ipt2 return end
© Cast3M 2003 - Tous droits réservés.
Mentions légales