mesu
C MESU SOURCE PASCAL 21/03/19 21:15:10 10924 C fournit la mesure d'un maillage SUBROUTINE mesu IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCREEL -INC CCGEOME -INC SMCOORD -INC SMELEME PARAMETER (NCLE=4) SEGMENT /FER/ (NFI(ITT),MAI(IPP),ITOUR) CHARACTER*4 mcle(NCLE) DATA mcle / 'LONG','SURF','VOLU','DENS' / *dbg write(ioimp,*) 'coucou mesu' segact mcoord icle=0 IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IF (ICLE.EQ.4) THEN IF (IERR.NE.0) RETURN RETURN ENDIF idimp1=IDIM+1 SEGACT,meleme ipt1=meleme itp=0 xmesu=xzero nsous=lisous(/1) DO isou=1,MAX(nsous,1) IF (nsous.NE.0) THEN ipt1=lisous(isou) SEGACT,ipt1 ENDIF jtyp=3 IF (ksurf(ipt1.itypel).EQ.ipt1.itypel) jtyp=2 IF (kdegre(ipt1.itypel).EQ.ipt1.itypel) jtyp=1 IF (itp.EQ.0) itp=jtyp IF (icle.EQ.0) icle=itp IF (IERR.NE.0) RETURN GOTO (100,200,300),icle C calcul de la longueur d'une ligne 100 IF (IIMPI.NE.0) WRITE(6,*) ' Mesure d''une ligne' nbnn=ipt1.num(/1) IF (IDIM.EQ.1) THEN DO iel=1,ipt1.num(/2) ip1=idimp1*(ipt1.num(1,iel)-1) ip2=idimp1*(ipt1.num(nbnn,iel)-1) xp12=XCOOR(ip2+1)-XCOOR(ip1+1) xmesu=xmesu+ABS(xp12) ENDDO ELSE IF (IDIM.EQ.2) THEN DO iel=1,ipt1.num(/2) ip1=idimp1*(ipt1.num(1,iel)-1) ip2=idimp1*(ipt1.num(nbnn,iel)-1) xp12=XCOOR(ip2+1)-XCOOR(ip1+1) yp12=XCOOR(ip2+2)-XCOOR(ip1+2) xmesu=xmesu+SQRT(xp12*xp12+yp12*yp12) ENDDO ELSE IF (IDIM.EQ.3) THEN DO iel=1,ipt1.num(/2) ip1=idimp1*(ipt1.num(1,iel)-1) ip2=idimp1*(ipt1.num(nbnn,iel)-1) xp12=XCOOR(ip2+1)-XCOOR(ip1+1) yp12=XCOOR(ip2+2)-XCOOR(ip1+2) zp12=XCOOR(ip2+3)-XCOOR(ip1+3) xmesu=xmesu+SQRT(xp12*xp12+yp12*yp12+zp12*zp12) ENDDO ENDIF GOTO 500 C calcul de la surface d'une aire 200 GOTO (220,240),jtyp C cas d'une ligne 220 IF (IIMPI.NE.0) WRITE(6,*) ' Mesure de surface dans un contour' SEGSUP,ipt5 ib=0 xb=xzero yb=xzero zb=xzero DO it=1,itour imdeb=mai(it)+1 imfin=mai(it+1) DO im=imdeb,imfin ib=ib+1 ip=idimp1*(nfi(im)-1) xb=xb+XCOOR(ip+1) yb=yb+XCOOR(ip+2) IF (IDIM.EQ.3) zb=zb+XCOOR(ip+3) ENDDO ENDDO xb=xb/ib yb=yb/ib zb=zb/ib IF (IIMPI.NE.0) WRITE(6,*) ' Barycentre ',xb,yb,zb xs=xzero ys=xzero zs=xzero zv1=xzero zv2=xzero DO it=1,itour imdeb=mai(it)+1 imfin=mai(it+1) DO im=imdeb,imfin im1=im+1 IF (im1.GT.imfin) im1=imdeb ip1=idimp1*(nfi(im)-1) ip2=idimp1*(nfi(im1)-1) xv1=XCOOR(ip1+1)-xb yv1=XCOOR(ip1+2)-yb xv2=XCOOR(ip2+1)-xb yv2=XCOOR(ip2+2)-yb IF (IDIM.GE.3) THEN zv1=XCOOR(ip1+3)-zb zv2=XCOOR(ip2+3)-zb ENDIF xs=xs+(yv1*zv2-zv1*yv2) ys=ys+(zv1*xv2-xv1*zv2) zs=zs+(xv1*yv2-yv1*xv2) ENDDO ENDDO xmesu=xmesu+0.5D0*SQRT(xs*xs+ys*ys+zs*zs) SEGSUP,fer GOTO 500 C cas d'une surface 240 IF (IIMPI.NE.0) WRITE(6,*) ' Mesure d''une surface' iad=LTEL(2,ipt1.itypel)-1 jad=LDEL(2,iad+1)-1 ityp=LDEL(1,iad+1) npfac=KDFAC(1,ityp) idep=KDFAC(2,ityp) ifep=idep+3*(KDFAC(3,ityp)-1) xs=xzero ys=xzero zs=xzero Cc=xzero DO iel=1,ipt1.num(/2) DO i=idep,ifep,3 iafa=LFAC(jad+KFAC(i)) ibfa=LFAC(jad+KFAC(i+1)) icfa=LFAC(jad+KFAC(i+2)) ia=ipt1.num(iafa,iel) ib=ipt1.num(ibfa,iel) ic=ipt1.num(icfa,iel) IF (IIMPI.EQ.5) WRITE(6,*) ' Triangle ',ia,ib,ic ia=idimp1*(ia-1) ib=idimp1*(ib-1) ic=idimp1*(ic-1) xb=XCOOR(ib+1) yb=XCOOR(ib+2) xv1=XCOOR(ia+1)-xb yv1=XCOOR(ia+2)-yb xv2=XCOOR(ic+1)-xb yv2=XCOOR(ic+2)-yb IF (IDIM.GE.3) THEN zb=XCOOR(ib+3) zv1=XCOOR(ia+3)-zb zv2=XCOOR(ic+3)-zb xs=yv1*zv2-zv1*yv2 ys=zv1*xv2-xv1*zv2 ENDIF zs=xv1*yv2-yv1*xv2 Cc=Cc+SQRT(xs*xs+ys*ys+zs*zs) ENDDO ENDDO xmesu=xmesu+0.5D0*Cc GOTO 500 C calcul d'un volume 300 GOTO (320,320,340),jtyp C cas du volume interieur a une surface C du fait du probleme d'orientation des elements on ne peut pas C traiter le probleme sous-maillage par sous maillage GOTO 11 C cas d'un volume. On va utiliser le decoupage en triangle de la C surface des elements mais en le dedoublant de facon a etre sur C de correspondre d'un element au voisin C SG 20160712 : pour les faces TRI7, QUA9 (ityp=7,8), il n'y a pas C besoin de dedoubler car le decoupage de la face est symetrique C (barycentrique) 340 nbfac=LTEL(1,ipt1.itypel) IF (nbfac.EQ.0) GOTO 500 iad=LTEL(2,ipt1.itypel)-1 kdeg=KDEGRE(ipt1.itypel)-1 Cc=xzero DO iel=1,ipt1.num(/2) C centre de gravite du volume xb=xzero yb=xzero zb=xzero nbnn=ipt1.num(/1) DO i=1,nbnn ipt=idimp1*(ipt1.num(i,iel)-1) xb=xb+XCOOR(ipt+1) yb=yb+XCOOR(ipt+2) zb=zb+XCOOR(ipt+3) ENDDO xb=xb/nbnn yb=yb/nbnn zb=zb/nbnn DO ifac=1,nbfac v=xzero ityp=LDEL(1,iad+ifac) npfac=KDFAC(1,ityp) jad=LDEL(2,iad+ifac)-1 idep=KDFAC(2,ityp) ifep=idep+3*(KDFAC(3,ityp)-1) DO i=idep,ifep,3 iafa=LFAC(jad+KFAC(i)) ibfa=LFAC(jad+KFAC(i+1)) icfa=LFAC(jad+KFAC(i+2)) ia=ipt1.num(iafa,iel) ib=ipt1.num(ibfa,iel) ic=ipt1.num(icfa,iel) ENDDO * SG IF (ITYP.NE.7.AND.ITYP.NE.8) THEN DO i=idep,ifep,3 ifa=KFAC(i)+kdeg IF (ifa.GT.npfac) ifa=ifa-npfac ifb=KFAC(i+1)+kdeg IF (ifb.GT.npfac) ifb=ifb-npfac ifc=KFAC(i+2)+kdeg IF (ifc.GT.npfac) ifc=ifc-npfac iafa=LFAC(jad+ifa) ibfa=LFAC(jad+ifb) icfa=LFAC(jad+ifc) ia=ipt1.num(iafa,iel) ib=ipt1.num(ibfa,iel) ic=ipt1.num(icfa,iel) ENDDO ELSE v=v*2 ENDIF IF (IIMPI.EQ.1) WRITE(6,*) 'v-2 ',v Cc=Cc+ABS(v) ENDDO ENDDO xmesu=xmesu+Cc/12.D0 500 CONTINUE ENDDO 11 CONTINUE END
© Cast3M 2003 - Tous droits réservés.
Mentions légales