faccvx
C FACCVX SOURCE OF166741 24/10/03 21:15:11 12022 C_______________________________________________________________________ C Calcul des facteurs de forme en 2D-plan et 3D pour une geometrie C convexe C Pas de coques avec l'option convexe C Traitement des quadratiques en se ramenant a des elements C lineaires 'enveloppe' C_______________________________________________________________________ C Arguments : C in : MYMOD : objet MMODEL contenant la geometrie C in : NGAUSS : nombre de points de Gauss en 3D (INTEGER ) C out: ICHFAC : objet MCHAML contenant les facteurs de forme C_______________________________________________________________________ C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMMODEL -INC SMELEME -INC SMCOORD POINTEUR MYMOD.MMODEL POINTEUR ISSMA.MELEME , ISSMB.MELEME C_______________________________________________________________________ C FACTEURS DE FORME C NNBEL1 = NOMBRE DE LIGNES + 1 C NBEL2 = NOMBRE DE COLONNES C LFACT(NNBEL1) POINTE SUR LE TABLEAU DES SURFACES C SEGMENT IFACFO INTEGER LFACT(NNBEL1) ENDSEGMENT SEGMENT LFAC REAL*8 FACT(NBEL2) ENDSEGMENT POINTEUR PSUR.LFAC, PLIG.LFAC POINTEUR PCOL.LFAC C_______________________________________________________________________ SEGMENT,INFOEL LOGICAL KCOQ(N1), KQUAD(N1) ENDSEGMENT C_______________________________________________________________________ C structures nécessaires aux arguments de sous-programmes SEGMENT PMATG REAL*8 G(11,10) ENDSEGMENT SEGMENT PTRA23 INTEGER NYA(5),NYB(5) REAL*8 AM(IDIM,5),BM(IDIM,5),UA(IDIM+1),UB(IDIM+1) ENDSEGMENT LOGICAL MALEUR LOGICAL ICOQ C_______________________________________________________________________ C KIMP=IIMPI MALEUR = .FALSE. EDIS = 0.00001 C... elements quadratiques NSPA1=1 NSPA2=1 IF (INFOEL.EQ.0) THEN ICOQ= .FALSE. ELSE ICOQ= .TRUE. SEGACT INFOEL ENDIF C C Calcul du nombre de faces NFACE et activation de maillages C N1 = MYMOD.KMODEL(/1) NFACE = 0 DO 10 ITYP=1,N1 IMODEL = MYMOD.KMODEL(ITYP) IPT1 = IMAMOD NFACE = NFACE + IPT1.NUM(/2) 10 CONTINUE C C>>> INITIALISATION OBJET FACFOR C --------------------------- C NNBEL1=NFACE+1 NBEL2=NFACE SEGINI IFACFO DO 900 LS=1,NNBEL1 SEGINI PLIG LFACT(LS)=PLIG SEGACT PLIG*MOD 900 CONTINUE PSUR = LFACT(NNBEL1) SEGACT PSUR*MOD C ------------------------------------------------------------- C IF (IDIM.EQ.3) THEN SEGINI ,PMATG ENDIF SEGINI,PTRA23 C NELTA=0 DO NSMA=1,N1 C ---------------------------------------------------------- C On boucle sur les sous-objets MAILLAGE -> NSMA C NSPA1=1 IF (ICOQ.AND.KQUAD(NSMA)) NSPA1=2 IMODE1 = MYMOD.KMODEL(NSMA) ISSMA = IMODE1.IMAMOD NSGEO1= ISSMA.NUM(/1) C** NAM = ISSMA.NUM(/1) IF (IDIM.EQ.2) THEN NAM=2 ELSE NAM=NSGEO1 IF (ICOQ.AND.KQUAD(NSMA)) NAM=NSGEO1/2 ENDIF NNELMA = ISSMA.NUM(/2) C DO NELMA=1,NNELMA C ------------------------------------------------------ KA = NELMA + NELTA PLIG = LFACT(KA) C On boucle sur les éléments de NSMA -> NELMA C Remplissage du tableau AM DO I=1, NSGEO1, NSPA1 LS=I IF (ICOQ.AND.KQUAD(NSMA)) LS=(I+1)/2 C On boucle sur les noeuds de NELMA IG = ISSMA.NUM(I,NELMA) C** NYA(I) = IG NYA(LS) = IG IREF = (IDIM+1)*(IG-1) IF(IIMPI.GE.4) WRITE(3,*) ' NELMA I ',NELMA,I DO K=1,IDIM AM(K,LS)=XCOOR(IREF+K) ENDDO IF(IIMPI.GE.4) WRITE(3,*) ' AM ',(AM(K,LS),K=1,IDIM) ENDDO C C C Calcul de la normale->UA et de la surface->SA C ( SS ne sert pas ) IF (IDIM.EQ.3) THEN ELSE ENDIF C PSUR.FACT(KA) = SA C IF (IIMPI.GE.4) THEN WRITE (6,*) 'SURFACE DE L ELEMENT',NELMA,' : ',SA WRITE (6,*) 'normale ',(UA(K),K=1,IDIM) ENDIF C NELTB=0 DO NSMB=1,N1 C ---------------------------------------------------- C On boucle sur les sous-objets MAILLAGE -> NSMB NSPA2=1 IF (ICOQ.AND.KQUAD(NSMB)) NSPA2=2 IMODE2 = MYMOD.KMODEL(NSMB) ISSMB = IMODE2.IMAMOD NSGEO2 = ISSMB.NUM(/1) C** NBM = ISSMB.NUM(/1) IF (IDIM.EQ.2) THEN NBM=2 ELSE NBM=NSGEO2 IF (ICOQ.AND.KQUAD(NSMB)) NBM=NSGEO2/2 ENDIF NNELMB = ISSMB.NUM(/2) C DO NELMB=1,NNELMB C ------------------------------------------------- KB = NELMB + NELTB C On boucle sur les éléments de NSMB -> NELMB C C ****On regarde si l'on ne traite pas le même élément IF ((NSMA.EQ.NSMB).AND.(NELMA.EQ.NELMB)) THEN FF = 0.D0 ELSE DO I=1, NSGEO2, NSPA2 LS=I IF (ICOQ.AND.KQUAD(NSMB)) LS=(I+1)/2 C On boucle sur les noeuds de NELMB C IG = ISSMB.NUM(I,NELMB) C** NYB(I) = IG NYB(LS) = IG IREF = (IDIM+1)*(IG-1) IF(IIMPI.GE.4) WRITE(6,*) ' NELMB I ',NELMB,I DO K=1,IDIM C** BM(K,I)=XCOOR(IREF+K) BM(K,LS)=XCOOR(IREF+K) ENDDO IF(IIMPI.GE.4) WRITE(6,*) ' BM ',(BM(K,LS),K=1,IDIM) C ENDDO C C *****Calcul de la normale à NELMB -> UB IF (IDIM.EQ.3) THEN ELSE ENDIF C PS = 0.D0 DO K=1,IDIM PS = PS + UA(K)*UB(K) ENDDO C IF (PS.LT.(0.995)) THEN IF (IDIM.EQ.3) THEN ELSE ENDIF C IF (FF.LT.1.D-6) THEN MALEUR = .TRUE. C** GOTO 60 ENDIF C FF = FF/SA ELSE FF = 0.D0 ENDIF PLIG.FACT(KB) = FF C ENDIF C ENDDO C fin NELMB ---------------------------------------- NELTB=NELTB+NNELMB C ENDDO C fin NSMB -------------------------------------------- C ENDDO C fin NELMA --------------------------------------------- NELTA=NELTA+NNELMA C ENDDO C fin NSMA ------------------------------------------------- C SEGSUP PTRA23 IF (IDIM.EQ.3) THEN SEGSUP PMATG ENDIF 60 CONTINUE IF (MALEUR.EQV..TRUE.) THEN WRITE (6,*) 'verifiez l orientation des elements' ENDIF C C>>> CACUL DES BILANS ET IMPRESSION (pas de normalisation en convexe) C ------------------------------ INOR=0 C Traduction puis suppression de IFACFO IF (KIMP.GE.3) THEN ENDIF LTITR=1 INFOEL=0 SEGACT IFACFO DO 930 LS=1,NNBEL1 PLIG=LFACT(LS) SEGSUP PLIG 930 CONTINUE PSUR = LFACT(NNBEL1) SEGSUP IFACFO END
© Cast3M 2003 - Tous droits réservés.
Mentions légales