calcga
C CALCGA SOURCE GOUNAND 21/06/02 21:15:01 11022 $ JPC, $ METRIQ, $ TATRAV, $ FC, $ IMPR,IRET) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : CALCGA C DESCRIPTION : Calcul de la loi de comportement aux points de Gauss C C C LANGAGE : ESOPE C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/LTMF) C mél : gounand@semt2.smts.cea.fr C*********************************************************************** C APPELES : C APPELE PAR : C*********************************************************************** C ENTREES : C ENTREES/SORTIES : C SORTIES : - C TRAVAIL : C*********************************************************************** C VERSION : v3.1, 30/07/04, possiblité de travailler C dans l'espace de référence et d'avoir les comp. de la C matrice jacobienne. C VERSION : v1, 11/05/04, version initiale C HISTORIQUE : v1, 11/05/04, création C HISTORIQUE : C HISTORIQUE : C*********************************************************************** C Prière de PRENDRE LE TEMPS de compléter les commentaires C en cas de modification de ce sous-programme afin de faciliter C la maintenance ! C*********************************************************************** -INC PPARAM -INC CCOPTIO -INC TNLIN *-INC SMCHAEL INTEGER NBLIG,NBCOL,N2LIG,N2COL,NBPOI,NBELM,N1 POINTEUR FC.MCHEVA POINTEUR LCOF.LCHEVA POINTEUR MYCOF.MCHEVA POINTEUR JMAJAC.MCHEVA POINTEUR JMIJAC.MCHEVA POINTEUR JDTJAC.MCHEVA POINTEUR JMAREG.MCHEVA POINTEUR JDIAMA.MCHEVA POINTEUR JPC.MCHEVA * les MCHEVA des coefficient *-INC SLCOMP POINTEUR IVCOM.COMP *-INC SMTNLIN -INC SMLENTI POINTEUR IICOM.MLENTI *-INC TMPREC POINTEUR METRIQ.MPREC * Segments où l'on stocke les nombres d'éléments et nombre de points de * Gauss pour chaque champ à fin de vérification POINTEUR LNELEM.MLENTI POINTEUR LNPOGA.MLENTI * REAL*8 XFCOM * Si IPRDU=1, on va chercher les coeffs dans VCOFPR * Si IPRDU=2, on va chercher les coeffs dans VCOFDU INTEGER IPRDU INTEGER IMPR,IRET CHARACTER*8 NOMLOI LOGICAL LREF LOGICAL LJACO * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans calcga' * IESREL=IDIM * NBCHE=0 SEGINI LCOF JG=0 SEGINI LNELEM JG=0 SEGINI LNPOGA * * SEGPRT,TABVC * WRITE(IOIMP,*) 'IPRDU=',IPRDU SEGACT IVCOM SEGACT IICOM NCOCOF=IVCOM.DERCOF(/1) LJACO=IVCOM.LTREF DO ICOCOF=1,NCOCOF IJGVD=IICOM.LECT(ICOCOF) LDER=IVCOM.DERCOF(ICOCOF) IF (LDER.EQ.0) THEN MYCOF=TATRAV.VD(IJGVD) SEGACT MYCOF NEL=MYCOF.WELCHE(/6) NPG=MYCOF.WELCHE(/5) SEGDES MYCOF LCOF.LISCHE(**)=MYCOF LNELEM.LECT(**)=NEL LNPOGA.LECT(**)=NPG ELSEIF (LDER.EQ.1) THEN MYCOF=TATRAV.DVD(IJGVD) SEGACT MYCOF NEL=MYCOF.WELCHE(/6) NPG=MYCOF.WELCHE(/5) SEGDES MYCOF LCOF.LISCHE(**)=MYCOF LNELEM.LECT(**)=NEL LNPOGA.LECT(**)=NPG ELSEIF (LDER.EQ.2) THEN MYCOF=TATRAV.VD(IJGVD) SEGACT MYCOF NEL=MYCOF.WELCHE(/6) NPG=MYCOF.WELCHE(/5) SEGDES MYCOF LCOF.LISCHE(**)=MYCOF LNELEM.LECT(**)=NEL LNPOGA.LECT(**)=NPG MYCOF=TATRAV.DVD(IJGVD) SEGACT MYCOF NEL=MYCOF.WELCHE(/6) NPG=MYCOF.WELCHE(/5) SEGDES MYCOF LCOF.LISCHE(**)=MYCOF LNELEM.LECT(**)=NEL LNPOGA.LECT(**)=NPG ELSE WRITE(IOIMP,*) 'Erreur Grave 2' GOTO 9999 ENDIF ENDDO SEGDES IICOM * * Cas particulier des coeffs dépendant de la matrice * jacobienne * IF (LJACO) THEN SEGACT JMAJAC NEL=JMAJAC.WELCHE(/6) NPG=JMAJAC.WELCHE(/5) SEGDES JMAJAC LCOF.LISCHE(**)=JMAJAC LNELEM.LECT(**)=NEL LNPOGA.LECT(**)=NPG IF (JMIJAC.NE.0) THEN SEGACT JMIJAC NEL=JMIJAC.WELCHE(/6) NPG=JMIJAC.WELCHE(/5) SEGDES JMIJAC ELSE NEL=0 NPG=0 ENDIF LCOF.LISCHE(**)=JMIJAC LNELEM.LECT(**)=NEL LNPOGA.LECT(**)=NPG SEGACT JDTJAC NEL=JDTJAC.WELCHE(/6) NPG=JDTJAC.WELCHE(/5) SEGDES JDTJAC LCOF.LISCHE(**)=JDTJAC LNELEM.LECT(**)=NEL LNPOGA.LECT(**)=NPG IF (JMAREG.NE.0) THEN SEGACT JMAREG NEL=JMAREG.WELCHE(/6) NPG=JMAREG.WELCHE(/5) SEGDES JMAREG LCOF.LISCHE(**)=JMAREG LNELEM.LECT(**)=NEL LNPOGA.LECT(**)=NPG ENDIF IF (JDIAMA.NE.0) THEN SEGACT JDIAMA NEL=JDIAMA.WELCHE(/6) NPG=JDIAMA.WELCHE(/5) SEGDES JDIAMA LCOF.LISCHE(**)=JDIAMA LNELEM.LECT(**)=NEL LNPOGA.LECT(**)=NPG ENDIF IF (JPC.NE.0) THEN SEGACT JPC NEL=JPC.WELCHE(/6) NPG=JPC.WELCHE(/5) SEGDES JPC LCOF.LISCHE(**)=JPC LNELEM.LECT(**)=NEL LNPOGA.LECT(**)=NPG ENDIF ENDIF * Vérifications des dimensions * Calcul des max JG=LNELEM.LECT(/1) NELMAX=1 NPGMAX=1 DO IG=1,JG NELMAX=MAX(NELMAX,LNELEM.LECT(IG)) NPGMAX=MAX(NPGMAX,LNPOGA.LECT(IG)) ENDDO SEGSUP LNELEM SEGSUP LNPOGA * Vérif proprement dite * Inutilisable car JMIJAC peut être nul... * SEGACT LCOF.LISCHE(*) NL=LCOF.LISCHE(/1) DO IL=1,NL MYCOF=LCOF.LISCHE(IL) IF (MYCOF.NE.0) THEN SEGACT MYCOF ENDIF ENDDO IG=0 DO ICOCOF=1,NCOCOF LDER=IVCOM.DERCOF(ICOCOF) IF (LDER.EQ.0) THEN IG=IG+1 MYCOF=LCOF.LISCHE(IG) NDLIG =MYCOF.WELCHE(/1) NDCOL =MYCOF.WELCHE(/2) N2DLIG=MYCOF.WELCHE(/3) N2DCOL=MYCOF.WELCHE(/4) NDNOEU=MYCOF.WELCHE(/5) NDELM =MYCOF.WELCHE(/6) IF (NDLIG.NE.1.OR.NDCOL.NE.1.OR.N2DLIG.NE.1.OR. $ N2DCOL.NE.1 $ .OR.(NDNOEU.NE.1.AND.NDNOEU.NE.NPGMAX) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NELMAX)) THEN WRITE(IOIMP,*) 'Erreur dims MYCOF' WRITE(IOIMP,*) 'ICOCOF=',ICOCOF WRITE(IOIMP,*) 'NDLIG=',NDLIG WRITE(IOIMP,*) 'NDCOL=',NDCOL WRITE(IOIMP,*) 'N2DLIG=',N2DLIG WRITE(IOIMP,*) 'N2DCOL=',N2DCOL WRITE(IOIMP,*) 'NDNOEU=',NDNOEU WRITE(IOIMP,*) 'NDELM =',NDELM WRITE(IOIMP,*) 'NPGMAX=',NPGMAX WRITE(IOIMP,*) 'NELMAX=',NELMAX GOTO 9999 ENDIF ELSEIF (LDER.EQ.1) THEN IG=IG+1 MYCOF=LCOF.LISCHE(IG) NDLIG =MYCOF.WELCHE(/1) NDCOL =MYCOF.WELCHE(/2) N2DLIG=MYCOF.WELCHE(/3) N2DCOL=MYCOF.WELCHE(/4) NDNOEU=MYCOF.WELCHE(/5) NDELM =MYCOF.WELCHE(/6) IF (NDLIG.NE.1.OR.NDCOL.NE.1.OR.N2DLIG.NE.1.OR. * Test faux si utilisation de 'EREF' * $ N2DCOL.NE.IESREL.OR. $ (NDNOEU.NE.1.AND.NDNOEU.NE.NPGMAX) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NELMAX)) THEN WRITE(IOIMP,*) 'Erreur dims MYCOF' WRITE(IOIMP,*) 'ICOCOF=',ICOCOF GOTO 9999 ENDIF ELSEIF (LDER.EQ.2) THEN IG=IG+1 MYCOF=LCOF.LISCHE(IG) NDLIG =MYCOF.WELCHE(/1) NDCOL =MYCOF.WELCHE(/2) N2DLIG=MYCOF.WELCHE(/3) N2DCOL=MYCOF.WELCHE(/4) NDNOEU=MYCOF.WELCHE(/5) NDELM =MYCOF.WELCHE(/6) IF (NDLIG.NE.1.OR.NDCOL.NE.1.OR.N2DLIG.NE.1.OR. $ N2DCOL.NE.1 $ .OR.(NDNOEU.NE.1.AND.NDNOEU.NE.NPGMAX) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NELMAX)) THEN WRITE(IOIMP,*) 'Erreur dims MYCOF' WRITE(IOIMP,*) 'ICOCOF=',ICOCOF GOTO 9999 ENDIF IG=IG+1 MYCOF=LCOF.LISCHE(IG) NDLIG =MYCOF.WELCHE(/1) NDCOL =MYCOF.WELCHE(/2) N2DLIG=MYCOF.WELCHE(/3) N2DCOL=MYCOF.WELCHE(/4) NDNOEU=MYCOF.WELCHE(/5) NDELM =MYCOF.WELCHE(/6) IF (NDLIG.NE.1.OR.NDCOL.NE.1.OR.N2DLIG.NE.1.OR. * Test faux si utilisation de 'EREF' * $ N2DCOL.NE.IESREL.OR. $ (NDNOEU.NE.1.AND.NDNOEU.NE.NPGMAX) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NELMAX)) THEN WRITE(IOIMP,*) 'Erreur dims MYCOF' WRITE(IOIMP,*) 'ICOCOF=',ICOCOF GOTO 9999 ENDIF ENDIF ENDDO * * Cas particulier matrice jacobienne * IF (LJACO) THEN IG=IG+1 MYCOF=LCOF.LISCHE(IG) NDLIG =MYCOF.WELCHE(/1) NDCOL =MYCOF.WELCHE(/2) N2DLIG=MYCOF.WELCHE(/3) * N2DCOL=MYCOF.WELCHE(/4) IESREF=MYCOF.WELCHE(/4) NDNOEU=MYCOF.WELCHE(/5) NDELM =MYCOF.WELCHE(/6) IF (NDLIG.NE.1.OR.NDCOL.NE.1.OR. $ N2DLIG.NE.IDIM.OR. * $ N2DCOL.NE.IDIM.OR. $ (NDNOEU.NE.1.AND.NDNOEU.NE.NPGMAX) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NELMAX)) THEN WRITE(IOIMP,*) 'Erreur dims JMAJAC' GOTO 9999 ENDIF IG=IG+1 MYCOF=LCOF.LISCHE(IG) IF (MYCOF.NE.0) THEN NDLIG =MYCOF.WELCHE(/1) NDCOL =MYCOF.WELCHE(/2) N2DLIG=MYCOF.WELCHE(/3) N2DCOL=MYCOF.WELCHE(/4) NDNOEU=MYCOF.WELCHE(/5) NDELM =MYCOF.WELCHE(/6) IF (NDLIG.NE.1.OR.NDCOL.NE.1.OR. * $ N2DLIG.NE.IDIM.OR.N2DCOL.NE.IDIM.OR. $ N2DCOL.NE.IDIM.OR. $ (NDNOEU.NE.1.AND.NDNOEU.NE.NPGMAX) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NELMAX)) THEN WRITE(IOIMP,*) 'Erreur dims JMIJAC' GOTO 9999 ENDIF ENDIF IG=IG+1 MYCOF=LCOF.LISCHE(IG) NDLIG =MYCOF.WELCHE(/1) NDCOL =MYCOF.WELCHE(/2) N2DLIG=MYCOF.WELCHE(/3) N2DCOL=MYCOF.WELCHE(/4) NDNOEU=MYCOF.WELCHE(/5) NDELM =MYCOF.WELCHE(/6) IF (NDLIG.NE.1.OR.NDCOL.NE.1.OR. $ N2DLIG.NE.1.OR.N2DCOL.NE.1.OR. $ (NDNOEU.NE.1.AND.NDNOEU.NE.NPGMAX) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NELMAX)) THEN WRITE(IOIMP,*) 'Erreur dims JDTJAC' GOTO 9999 ENDIF IF (JMAREG.NE.0) THEN IG=IG+1 MYCOF=LCOF.LISCHE(IG) NDLIG =MYCOF.WELCHE(/1) NDCOL =MYCOF.WELCHE(/2) N2DLIG=MYCOF.WELCHE(/3) N2DCOL=MYCOF.WELCHE(/4) NDNOEU=MYCOF.WELCHE(/5) NDELM =MYCOF.WELCHE(/6) IF (NDLIG.NE.1.OR.NDCOL.NE.1.OR. $ N2DLIG.NE.IESREF.OR.N2DCOL.NE.IESREF.OR. $ (NDNOEU.NE.1.AND.NDNOEU.NE.NPGMAX) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NELMAX)) THEN WRITE(IOIMP,*) 'Erreur dims JMAREG' GOTO 9999 ENDIF ENDIF IF (JDIAMA.NE.0) THEN IG=IG+1 MYCOF=LCOF.LISCHE(IG) NDLIG =MYCOF.WELCHE(/1) NDCOL =MYCOF.WELCHE(/2) N2DLIG=MYCOF.WELCHE(/3) N2DCOL=MYCOF.WELCHE(/4) NDNOEU=MYCOF.WELCHE(/5) NDELM =MYCOF.WELCHE(/6) IF (NDLIG.NE.1.OR.NDCOL.NE.1.OR. $ N2DLIG.NE.1.OR.N2DCOL.NE.1.OR. $ NDNOEU.NE.1.OR.NDELM.NE.1) THEN WRITE(IOIMP,*) 'Erreur dims JDIAMA' GOTO 9999 ENDIF ENDIF IF (JPC.NE.0) THEN IG=IG+1 MYCOF=LCOF.LISCHE(IG) NDLIG =MYCOF.WELCHE(/1) NDCOL =MYCOF.WELCHE(/2) N2DLIG=MYCOF.WELCHE(/3) N2DCOL=MYCOF.WELCHE(/4) NDNOEU=MYCOF.WELCHE(/5) NDELM =MYCOF.WELCHE(/6) IF (NDLIG.NE.1.OR.NDCOL.NE.1.OR. $ N2DLIG.NE.1.OR.N2DCOL.NE.1.OR. $ (NDNOEU.NE.1.AND.NDNOEU.NE.NPGMAX) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NELMAX)) THEN WRITE(IOIMP,*) 'Erreur dims JPC' GOTO 9999 ENDIF ENDIF ENDIF * * Initialisation du segment contenant la valeur de la loi de * comportement NBLIG=1 NBCOL=1 N2LIG=1 N2COL=1 NBPOI=NPGMAX NBELM=NELMAX SEGINI FC * * Calcul proprement dit * $ FC, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * * Fin * SEGDES FC * Inutilisable car JMIJAC peut être nul... * SEGDES LCOF.LISCHE(*) NL=LCOF.LISCHE(/1) DO IL=1,NL MYCOF=LCOF.LISCHE(IL) IF (MYCOF.NE.0) THEN SEGDES MYCOF ENDIF ENDDO SEGSUP LCOF SEGDES IVCOM * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine calcga' RETURN * * End of subroutine CALCGA * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales