mesuvo
C MESUVO SOURCE PV 20/03/30 21:21:09 10567 C mesure du volume contenu dans une surface fermee C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMELEME -INC CCGEOME -INC SMCOORD C Segments locaux C icpr tableau de compression des noeuds concernes C kon (numero point compresse par icpr,rang d'element,1) => pointeur su meleme C kon (numero point compresse par icpr,rang d'element,2) => numero element C ifut (rang d'element,1) => pointeur sur meleme C ifut (rang d'element,2) => element traite C ifut (rang d'element,3) => orientation a utiliser C segment kon(ite,nbk,3) segment ikon(ite) segment icpr(nbpts) xmesu=0.d0 segini icpr ite=0 segact meleme*mod ipt1=meleme do 10 isous=1,max(1,lisous(/1)) if (lisous(/1).ne.0) then ipt1=lisous(isous) segact ipt1*mod if (ierr.ne.0) return endif * cas des faces quaf tri7/qua9 : pas de prise en compte du noeud central if (ipt1.itypel.eq.7.or.ipt1.itypel.eq.11) then idec1=1 else idec1=0 endif do 15 ipt=1,ipt1.num(/1)-idec1 do 151 iel=1,ipt1.num(/2) if (icpr(ipt1.num(ipt,iel)).ne.0) goto 151 ite=ite+1 icpr(ipt1.num(ipt,iel))=ite 151 continue 15 continue 10 continue nbk=8 C on remplit kon qui donne les elements touchant un noeud (compacte) segini kon,ikon do 20 isous=1,max(1,lisous(/1)) if (lisous(/1).ne.0) ipt1=lisous(isous) * cas des faces quaf tri7/qua9 : pas de prise en compte du noeud central if (ipt1.itypel.eq.7.or.ipt1.itypel.eq.11) then idec1=1 else idec1=0 endif do 25 ipt=1,ipt1.num(/1)-idec1 do 251 iel=1,ipt1.num(/2) ip=icpr(ipt1.num(ipt,iel)) ikon(ip)=ikon(ip)+1 if (ikon(ip).gt.nbk) then nbk=nbk+1 segadj kon endif kon(ip,ikon(ip),1)=ipt1 kon(ip,ikon(ip),2)=iel 251 continue 25 continue 20 continue C on commence a travailler segini ifut ifut(i,3)=1 30 continue ilcou=0 iltop=1 ifut(1,1)=ipt1 ifut(1,2)=1 ifut(1,3)=1 ipt1.num(1,1)=-ipt1.num(1,1) 100 continue ilcou=ilcou+1 if (ilcou.gt.iltop) goto 500 ipt2=ifut(ilcou,1) iel=ifut(ilcou,2) isens=ifut(ilcou,3) * cas des faces quaf tri7/qua9 : pas de prise en compte du noeud central if (ipt2.itypel.eq.7.or.ipt2.itypel.eq.11) then idec2=1 else idec2=0 endif C on cherche les elements contactant iel et on les oriente correctement C on note qu'ils sont traites en mettant en neg le premier noeud do 110 i=1,ipt2.num(/1)-idec2 ip1=abs(ipt2.num(i,iel)) i1=i+1 if (i1.gt.ipt2.num(/1)-idec2) i1=1 i0=i-1 if (i0.lt.1) i0=ipt2.num(/1)-idec2 if (isens.eq.1) ip2=abs(ipt2.num(i1,iel)) if (isens.eq.-1) ip2=abs(ipt2.num(i0,iel)) do 120 j=1,ikon(icpr(ip1)) ipt3=kon(icpr(ip1),j,1) jel=kon(icpr(ip1),j,2) jsens=isign(1,ipt3.num(2,jel)) * write (6,*) ' isens,jsens,iel,jel ',isens,jsens,iel,jel,ip1,ip2 if (ipt3.eq.ipt2.and.jel.eq.iel) goto 120 * cas des faces quaf tri7/qua9 : pas de prise en compte du noeud central if (ipt3.itypel.eq.7.or.ipt3.itypel.eq.11) then idec3=1 else idec3=0 endif do 130 in=1,ipt3.num(/1)-idec3 if (abs(ipt3.num(in,jel)).ne.ip1) goto 130 in1=in+1 if (in1.gt.ipt3.num(/1)-idec3) in1=1 in0=in-1 if (in0.lt.1) in0=ipt3.num(/1)-idec3 if ((abs(ipt3.num(in1,jel)).eq.ip2.and.jsens.eq.1).or. * (abs(ipt3.num(in0,jel)).eq.ip2.and.jsens.eq.-1)) $ then C Il faut reorienter l'element if (iimpi.eq.5) write(6,*) ' element ',ipt3,jel $ ,' change de sens' if (ipt3.num(1,jel).lt.0) goto 999 if (ierr.ne.0) return ipt3.num(1,jel)=-abs(ipt3.num(1,jel)) iltop=iltop+1 ifut(iltop,1)=ipt3 ifut(iltop,2)=jel ifut(iltop,3)=-jsens ipt3.num(2,jel)=-abs(ipt3.num(2,jel)) goto 110 elseif ((abs(ipt3.num(in1,jel)).eq.ip2.and.jsens.eq.-1) * .or.(abs(ipt3.num(in0 $ ,jel)).eq.ip2.and.jsens.eq.1)) then C Element OK if (iimpi.eq.5) write(6,*) ' element ',ipt3,jel, $ ' bon sens ' if (ipt3.num(1,jel).lt.0) goto 110 ipt3.num(1,jel)=-abs(ipt3.num(1,jel)) iltop=iltop+1 ifut(iltop,1)=ipt3 ifut(iltop,2)=jel ifut(iltop,3)=jsens goto 110 else endif 130 continue 120 continue goto 999 110 continue goto 100 500 continue C il ne reste plus qu'a calculer le volume et remettre les elements corrects if (ierr.ne.0) return ipt1=ifut(i,1) iel=ifut(i,2) isens=ifut(i,3) IAD=LTEL(2,IPT1.ITYPEL)-1 kdeg=kdegre(IPT1.ITYPEL)-1 ITYP=LDEL(1,IAD+1) NPFAC=KDFAC(1,ITYP) JAD=LDEL(2,IAD+1)-1 IDEP=KDFAC(2,ITYP) IFEP=IDEP+3*(KDFAC(3,ITYP)-1) dxmesu=0.d0 DO 610 ITRIAN=IDEP,IFEP,3 IAFA=LFAC(JAD+KFAC(ITRIAN)) IBFA=LFAC(JAD+KFAC(ITRIAN+1)) ICFA=LFAC(JAD+KFAC(ITRIAN+2)) IA=abs(IPT1.NUM(IAFA,IEL)) IB=abs(IPT1.NUM(IBFA,IEL)) IC=abs(IPT1.NUM(ICFA,IEL)) * if (iimpi.eq.5) write (6,*) ' triangle ',ia,ib,ic 610 continue C SG 20160712 : comme dans mesu.eso, pour les faces TRI7, QUA9 (ityp C =7,8), il n'y a pas besoin de dedoubler car le decoupage de la C face est symetrique (barycentrique) IF (ITYP.NE.7.AND.ITYP.NE.8) THEN DO 611 ITRIAN=IDEP,IFEP,3 ifa=KFAC(ITRIAN)+kdeg if (ifa.gt.npfac) ifa=ifa-npfac ifb=KFAC(ITRIAN+1)+kdeg if (ifb.gt.npfac) ifb=ifb-npfac ifc=KFAC(ITRIAN+2)+kdeg if (ifc.gt.npfac) ifc=ifc-npfac IAFA=LFAC(JAD+ifa) IBFA=LFAC(JAD+ifb) ICFA=LFAC(JAD+ifc) IA=abs(IPT1.NUM(IAFA,IEL)) IB=abs(IPT1.NUM(IBFA,IEL)) IC=abs(IPT1.NUM(ICFA,IEL)) 611 continue ELSE dxmesu=dxmesu*2 ENDIF xmesu=xmesu+dxmesu 600 continue goto 998 999 continue 998 continue C maintenant on desactive les segments et on remet les elements correctement ipt1=meleme do 620 isous=1,max(1,lisous(/1)) if (lisous(/1).ne.0) ipt1=lisous(isous) do 630 iel=1,ipt1.num(/2) ipt1.num(1,iel)=abs(ipt1.num(1,iel)) ipt1.num(2,iel)=abs(ipt1.num(2,iel)) 630 continue segdes ipt1 620 continue segdes meleme segsup icpr,kon,ikon,ifut xmesu=abs(xmesu) end
© Cast3M 2003 - Tous droits réservés.
Mentions légales