nlia
C NLIA SOURCE PV 22/04/27 21:15:08 11344 $ METING,LAXI,LERF,LERJ, $ MYFALS,MYPGS,MYFPGS,MYQRFS, $ TABMAT, $ IMPR,IRET) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : NLIA C DESCRIPTION : Création d'une matrice intégration des termes de surface 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 : PRLIN2 C*********************************************************************** C ENTREES : C ENTREES/SORTIES : - C SORTIES : C TRAVAIL : * SOUGEO (type MELEME) : maillage élémentaire. C * MLLRFS (type MLLRFS) : pointeurs sur les C éléments de référence associés aux 4 espaces de C discrétisation (géométrie, coefficient, primal, C dual) sur le maillage élémentaire. C * PGCOUR (type POGAU) : méthode d'intégration C courante. C * JCOOR (type MCHEVA) : valeurs du champ ICOOR C sur le maillage élémentaire. C Structure (cf.include SMCHAEL) : C (1, nb. ddl, 1, dim. esp. réel, C 1, nb. éléments) C * JCOEFF (type MCHEVA) : valeurs du champ ICOEFF C sur le maillage élémentaire. C Structure (cf.include SMCHAEL) : C (1, nb. ddl, nb. comp. duales, C nb. comp. primales, 1, nb. éléments) C * JMTLIA (type MCHEVA) : valeurs du champ IMTLIA C sur le maillage élémentaire. C Structure (cf.include SMCHAEL) : C (nb. ddl dual, nb. ddl primal, C nb. comp. duales, nb. comp. primales, C 1, nb. éléments) C nb. ddl primal=1 si la matrice est condensée. C * JMAJAC (type MCHEVA) : valeurs de la matrice C jacobienne aux points de Gauss sur le maillage C élémentaire. C Structure (cf.include SMCHAEL) : C (1, 1, dim. esp. réel, dim. esp. référence, C nb. poi. gauss, nb. éléments) C * JMIJAC (type MCHEVA) : valeurs de l'inverse de C la matrice jacobienne aux points de Gauss sur C le maillage élémentaire. C Structure (cf.include SMCHAEL) : C (1, 1, dim. esp. référence, dim. esp. réel, C nb. poi. gauss, nb. éléments) C JMIJAC n'existe que si dim.esp.réf=dim.esp.réel C * JDTJAC (type MCHEVA) : valeurs du déterminant C de la matrice jacobienne aux points de Gauss C sur le maillage élémentaire. C Structure (cf.include SMCHAEL) : C (1, 1, 1, 1, nb. poi. gauss, nb. éléments) C Si la matrice jacobienne n'est pas carrée, on C a calculé sqrt(det(trans(J).J)) C * JCOEFG (type MCHEVA) : valeurs du coefficient C tensoriel aux points de Gauss sur le maillage C élémentaire. C Structure (cf.include SMCHAEL) : C (1, 1, nb. comp. duales, nb. comp. primales, C nb. poi. gauss, nb. éléments) C * FFPG (type MCHEVA) : valeurs des fonctions C d'interpolation aux points de gauss sur C l'élément de référence. C Structure (cf.include SMCHAEL) : C (1, nb. ddl, 1, 1, nb. poi. gauss, 1) C * DFFPG (type MCHEVA) : valeurs des dérivées C premières des fonctions d'interpolation aux C points de gauss sur l'élément de référence. C Structure (cf.include SMCHAEL) : C (1, nb. ddl, 1, dim.esp.réf, nb. poi. gauss, 1) C * JDFFPG (type MCHEVA) : valeurs des dérivées C premières des fonctions d'interpolation C primales aux points de gauss sur l'élément C réel. C Structure (cf.include SMCHAEL) : C (1, nb. ddl, 1, dim.esp.réel, nb. poi. gauss, C nb. élém.) C * JDFFDG (type MCHEVA) : valeurs des dérivées C premières des fonctions d'interpolation C duales aux points de gauss sur l'élément réel. C Structure (cf.include SMCHAEL) : C (1, nb. ddl, 1, dim.esp.réel, nb. poi. gauss, C nb. élém.) C*********************************************************************** C VERSION : v4, 26/07/06, refonte sur le modele du nlin evolue C VERSION : v3, 11/05/04, refonte (ajout comportement) C VERSION : v2, 22/09/03, refonte complète (modif SMTNLIN) C VERSION : v1, 22/08/2003, version initiale C HISTORIQUE : v1, 22/08/2003, création C HISTORIQUE : 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 CCGEOME -INC TNLIN *-INC SELREF POINTEUR LRFVOL.ELREF *-INC SFALRF POINTEUR MYFALS.FALRFS *-INC SPOGAU POINTEUR MYPGS.POGAUS *-INC SFAPG POINTEUR MYFPGS.FAPGS *-INC SLCOMP POINTEUR MYCOM.COMP POINTEUR IVCOMP.COMP POINTEUR IVCOMD.COMP -INC SMLENTI POINTEUR IPOWCO.MLENTI -INC SMELEME POINTEUR CGEOME.MELEME POINTEUR SOUGEO.MELEME POINTEUR FACVOL.MELEME POINTEUR SFAVOL.MELEME * *-INC SMCHAEL INTEGER N1 POINTEUR ICOOR.MCHAEL POINTEUR MYMCHA.MCHAEL POINTEUR JXCOPG.MCHEVA POINTEUR JXPOPG.MCHEVA POINTEUR JCOOR.MCHEVA,JCOEFF.MCHEVA,JCOEFG.MCHEVA POINTEUR JDCOFG.MCHEVA POINTEUR JMAJAC.MCHEVA,JMIJAC.MCHEVA,JDTJAC.MCHEVA POINTEUR JMAJA2.MCHEVA,JMIJA2.MCHEVA,JDTJA2.MCHEVA POINTEUR JDTJA3.MCHEVA POINTEUR IPROCO.MCHEVA POINTEUR FC.MCHEVA POINTEUR FFPG.MCHEVA,DFFPG.MCHEVA,JDFFPG.MCHEVA POINTEUR FVPR.MCHEVA,FVDU.MCHEVA POINTEUR FCPR.MCHEVA,FCDU.MCHEVA POINTEUR JMTLIA.MCHEVA *-INC SMTNLIN INTEGER NUMVPR,NUMVDU,NUMDER,NUMOP INTEGER JGVC,KGVC *-INC SFACTIV *-INC SIQUAF POINTEUR MYQRFS.IQUAFS POINTEUR IQUVOL.IQUAF POINTEUR IQUFAC.IQUAF * CHARACTER*4 METING INTEGER LAXI INTEGER LERF LOGICAL LERJ,LERJ2 INTEGER IMPR,IRET * CHARACTER*4 MYDISC * INTEGER NBELEF,NBELFV,NBELEV,NBSOFV,NBSOUV INTEGER IBELEF,IBELFV,IBELEV,IBSOFV,IBSOUV INTEGER IJVC,IKVC INTEGER IVARPR,IVARDU,KDERPR,KDERDU,IOP INTEGER ITYVOL,NBELEM LOGICAL LF,LDF,LC,LDC LOGICAL MVVPR,MVVDU,LVID * * Executable statements * * IMPR=0 lerj2=.false. IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans nlia' * Activation et intialisation des chapeaux SEGACT CGEOME SEGACT FACTIV SEGACT TABGEO SEGACT TABVDC SEGACT TATRAV*MOD NBSOUV=CGEOME.LISOUS(/1) NUMVPR=TABVDC.VVARPR(/1) NUMVDU=TABVDC.VVARDU(/1) JLCOF=TABVDC.VLCOF(/1) JGCOF=TABVDC.VCOMP(/1) JGVD=TABVDC.DJSVD(/1) KGVD=TABVDC.DISVD(/2) NUMDER=TABVDC.ILCPR(/1)-1 NUMOP=TABVDC.ILCPR(/2) * N1=NBSOUV * NUMVPR et NUMVDU initialisés ci-dessus SEGINI TABMAT * Cette instruction n'a pas l'air de fonctionner * SEGINI TABMAT.VMAT(*) DO IVARPR=1,NUMVPR DO IVARDU=1,NUMVDU SEGINI,MYMCHA ENDDO ENDDO SEGACT MYPGS ICOOR=TABGEO.JGEO SEGACT ICOOR * SEGACT TABVC.NOMVC(*) DO IJVD=1,JGVD MYMCHA=TATRAV.IVD(IJVD) IF (MYMCHA.NE.0) THEN SEGACT MYMCHA ENDIF ENDDO * * On travaille sur chaque sous-domaine * DO 1 IBSOUV=1,NBSOUV SOUGEO=CGEOME.LISOUS(IBSOUV) SEGACT SOUGEO SFACTI=FACTIV.IFACTI(IBSOUV) SEGACT,SFACTI * NBELEV=SOUGEO.NUM(/2) ITYVOL=SOUGEO.ITYPEL * Détermination de la dimension de l'espace de référence IF (IRET.NE.0) GOTO 9999 * IF (IRET.NE.0) GOTO 9999 * SEGACT IQUVOL FACVOL=IQUVOL.LFACE SEGDES IQUVOL SEGACT FACVOL NBSOFV=FACVOL.LISOUS(/1) * * On travaille sur chaque type de face pour chaque sous-domaine * DO 12 IBSOFV=1,NBSOFV SFAVOL=FACVOL.LISOUS(IBSOFV) SEGACT SFAVOL NBELFV=SFAVOL.NUM(/2) ITYFAC=SFAVOL.ITYPEL IF (IRET.NE.0) GOTO 9999 SSFACT=SFACTI.ISFACT(IBSOFV) * On calcule le nb de face pour un type de face d'un sous-domaine SEGACT SSFACT IBELEF=0 DO IBELEV=1,NBELEV DO IBELFV=1,NBELFV IF (SSFACT.LFACTI(IBELFV,IBELEV)) THEN IBELEF=IBELEF+1 ENDIF ENDDO ENDDO SEGDES SSFACT NBELEF=IBELEF * * Celui-ci peut être nul : Cas des prismes où on ne calcule des intégrales * de surface que sur les triangles * IF (NBELEF.EQ.0) GOTO 12 * Création des segments contenant les poids et points de Gauss sur * toutes les faces de l'élément de référence. * In CREPG : SEGINI JXCOPG * In CREPG : SEGINI JXPOPG $ JXCOPG,JXPOPG, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * * Géométrie * MYDISC=TABGEO.DISGEO $ MYFALS, $ LRFVOL, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * In KFNRFF : SEGINI FFPG * In KFNRFF : SEGINI DFFPG $ FFPG,DFFPG, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * * Création des matrices jacobiennes et déterminants * pour la transformation : élément volumique de référence <-> * élément volumique réel * Ici, on ne se servira que de l'inverse de la matrice * jacobienne. * In GEOLIF : SEGINI JMAJAC * In GEOLIF : SEGINI JMIJAC * In GEOLIF : SEGINI JDTJAC JCOOR=ICOOR.ICHEVA(IBSOUV) $ JMAJAC,JMIJAC,JDTJAC,LERJ, $ IMPR,IRET) IF (IRET.NE.0) THEN IF (LERJ) GOTO 9666 GOTO 9999 ENDIF SEGSUP DFFPG *! SEG SUP JMA JAC *! SEG SUP JDT JAC * * Création des matrices jacobiennes et déterminants * pour la transformation : élément surfacique de référence <-> * élément surfacique réel * Ici, on ne se servira que du déterminant de la matrice jacobienne. * In GEOLF2 : SEGINI JMAJA2 * In GEOLF2 : SEGINI JMIJA2 * In GEOLF2 : SEGINI JDTJA2 MYDISC=TABGEO.DISGEO $ MYDISC,METING,MYFALS,MYFPGS, $ JCOOR,SSFACT,NBELEF, $ JMAJA2,JMIJA2,JDTJA2,LERJ2, $ IMPR,IRET) IF (IRET.NE.0) THEN IF (LERJ2) THEN LERJ=LERJ2 GOTO 9666 ENDIF GOTO 9999 ENDIF IF (IRET.NE.0) GOTO 9999 SEGSUP JMAJA2 IF (JMIJA2.NE.0) THEN SEGSUP JMIJA2 ENDIF SEGSUP FFPG C Inutile normalement, on peut se débrouiller avec les coeffs C* En axi, on multiplie le determinant de la matrice C* jacobienne par 2piR (ou R est la premiere coordonnee) C IF (LAXI.GT.0) THEN C* In GEOMFT : SEGINI JDTJA3 C CALL GEOMFT(JCOOR,FFPG,SSFACT,NBELEF, C $ JDTJA2,LAXI, C $ JDTJA3, C $ IMPR,IRET) C IF (IRET.NE.0) GOTO 9999 C SEGSUP JDTJA2 C JDTJA2=JDTJA3 C ENDIF * * Attention : modif par rapport à nlin ! * JPC=0 JMAREG=0 JDIAMA=0 METRIQ=0 * * Calcul des fonctions de forme et de leurs dérivées * DO IKVD=1,KGVD LF=TATRAV.LFFVD(IKVD).EQV..TRUE. LDF=TATRAV.LDFFVD(IKVD).EQV..TRUE. IF (LF.OR.LDF) THEN MYDISC=TABVDC.DISVD(IKVD) $ MYFALS, $ LRFVOL, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * In KFNRFF : SEGINI FFPG * In KFNRFF : SEGINI DFFPG $ FFPG,DFFPG, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 IF (LF) THEN TATRAV.FFVD(IKVD)=FFPG ELSE * segini ffpg SEGSUP FFPG ENDIF IF (LDF) THEN IF (LERF.NE.0) THEN SEGINI,JDFFPG=DFFPG SEGDES JDFFPG ELSE * In DFNFRF : SEGINI JDFFPG $ JDFFPG, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 ENDIF TATRAV.DFFVD(IKVD)=JDFFPG ENDIF SEGSUP DFFPG ENDIF ENDDO * * Calcul des champs et de leurs dérivées * DO IJVD=1,JGVD LC=TATRAV.LVD(IJVD).EQV..TRUE. LDC=TATRAV.LDVD(IJVD).EQV..TRUE. IF (LC.OR.LDC) THEN MYMCHA=TATRAV.IVD(IJVD) JCOEFF=MYMCHA.ICHEVA(IBSOUV) IF (LC) THEN FFPG=TATRAV.FFVD(TABVDC.DJSVD(IJVD)) * In COGAUF : SEGINI JCOEFG $ JCOEFG, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 TATRAV.VD(IJVD)=JCOEFG ENDIF IF (LDC) THEN JDFFPG=TATRAV.DFFVD(TABVDC.DJSVD(IJVD)) * In DCOGAF : SEGINI JDCOFG $ JDCOFG, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 TATRAV.DVD(IJVD)=JDCOFG ENDIF ENDIF ENDDO *!!! SEG DES JMIJAC * * Calcul des coefficients * DO IJGCOF=1,JGCOF LC=TATRAV.LVCOF(IJGCOF).EQV..TRUE. IF (LC) THEN IVCOMP=TABVDC.VCOMP(IJGCOF) IICOMP=TABVDC.VLDAT(IJGCOF) * In CALCGA : SEGINI FC * In CALCGA : SEG INI METRIQ.MCHEVA $ JMAREG,JDIAMA,JPC,METRIQ, $ TATRAV, $ FC,IMPR,IRET) IF (IRET.NE.0) GOTO 9999 TATRAV.VCOF(IJGCOF)=FC ENDIF ENDDO * * Calcul des produits de coefficients * DO IJLCOF=1,JLCOF IPOWCO=TABVDC.VLCOF(IJLCOF) * In CALPCO : SEGINI IPROCO $ IPROCO,IMPR,IRET) IF (IRET.NE.0) GOTO 9999 TATRAV.VVCOF(IJLCOF)=IPROCO ENDDO * * On peut faire le ménage dans les coefficients * DO IJGCOF=1,JGCOF FC=TATRAV.VCOF(IJGCOF) IF (FC.NE.0) THEN SEGSUP,FC TATRAV.VCOF(IJGCOF)=0 ENDIF ENDDO * * On effectue le calcul de la matrice * DO IVARPR=1,NUMVPR DO IVARDU=1,NUMVDU *Bug mis en evidence par toimp_3d JMTLIA=0 JMTLIA=MYMCHA.ICHEVA(IBSOUV) IJVARP=TABVDC.VVARPR(IVARPR) IJVARD=TABVDC.VVARDU(IVARDU) IKVARP=TABVDC.DJSVD(IJVARP) IKVARD=TABVDC.DJSVD(IJVARD) MVVPR=(TABVDC.MVD(IJVARP).NE.0) MVVDU=(TABVDC.MVD(IJVARD).NE.0) DO IOP=1,NUMOP DO KDERPR=0,NUMDER IJLCPR=TABVDC.ILCPR(KDERPR+1,IOP,IVARPR) IF (IJLCPR.NE.0) THEN FCPR=TATRAV.VVCOF(IJLCPR) * variable primale IF (KDERPR.EQ.0) THEN IF (MVVPR) THEN FVPR=TATRAV.VD(IJVARP) ELSE FVPR=TATRAV.FFVD(IKVARP) ENDIF ELSE IF (MVVPR) THEN FVPR=TATRAV.DVD(IJVARP) ELSE FVPR=TATRAV.DFFVD(IKVARP) ENDIF ENDIF DO KDERDU=0,NUMDER IJLCDU=TABVDC.ILCDU(KDERDU+1,IOP,IVARDU) IF (IJLCDU.NE.0) THEN FCDU=TATRAV.VVCOF(IJLCDU) * Variable duale IF (KDERDU.EQ.0) THEN IF (MVVDU) THEN FVDU=TATRAV.VD(IJVARD) ELSE FVDU=TATRAV.FFVD(IKVARD) ENDIF ELSE IF (MVVDU) THEN FVDU=TATRAV.DVD(IJVARD) ELSE FVDU=TATRAV.DFFVD(IKVARD) ENDIF ENDIF * WRITE(IOIMP,*) 'FVPR=',FVPR * WRITE(IOIMP,*) 'FVDU=',FVDU * WRITE(IOIMP,*) 'FCPR=',FCPR * WRITE(IOIMP,*) 'FCDU=',FCDU * WRITE(IOIMP,*) 'KDERPR=',KDERPR * WRITE(IOIMP,*) 'KDERDU=',KDERDU * WRITE(IOIMP,*) 'LDERPR=',LDERPR * WRITE(IOIMP,*) 'LDERDU=',LDERDU * SEGPRT,JXPOPG * SEGPRT,FVPR * SEGPRT,FVDU * SEGPRT,FCPR * SEGPRT,FCDU * SEGPRT,JDTJA2 * WRITE(IOIMP,*) 'KDERPR=',KDERPR * WRITE(IOIMP,*) 'KDERDU=',KDERDU C WRITE(IOIMP,*) 'LDERPR=',LDERPR C WRITE(IOIMP,*) 'LDERDU=',LDERDU C SEGPRT,JDTJA2 C WRITE(IOIMP,*) 'NBELEF=',NBELEF $ FVPR,FVDU,FCPR,FCDU, $ KDERPR,KDERDU, $ JDTJA2,SSFACT,NBELEF,LERF,IESREF, $ JMTLIA, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 C WRITE(IOIMP,*) 'JMTLIA=',JMTLIA C SEGPRT,JMTLIA C* STOP 16 ENDIF ENDDO ENDIF ENDDO ENDDO MYMCHA.JMACHE(IBSOUV)=SOUGEO MYMCHA.ICHEVA(IBSOUV)=JMTLIA * IF (JMTLIA.NE.0) THEN * SEGPRT,JMTLIA * ENDIF C WRITE(IOIMP,*) 'IVARPR=',IVARPR C WRITE(IOIMP,*) 'IVARDU=',IVARDU C WRITE(IOIMP,*) 'JMTLIA=',JMTLIA ENDDO ENDDO * Suppression de tous les MCHEVA DO IJLCOF=1,JLCOF IPROCO=TATRAV.VVCOF(IJLCOF) SEGSUP IPROCO TATRAV.VVCOF(IJLCOF)=IPROCO ENDDO * DO IJVD=1,JGVD JCOEFG=TATRAV.VD(IJVD) IF (JCOEFG.NE.0) THEN SEGSUP JCOEFG TATRAV.VD(IJVD)=JCOEFG ENDIF JDCOFG=TATRAV.DVD(IJVD) IF (JDCOFG.NE.0) THEN SEGSUP JDCOFG TATRAV.DVD(IJVD)=JDCOFG ENDIF ENDDO * DO IKVD=1,KGVD FFPG=TATRAV.FFVD(IKVD) IF (FFPG.NE.0) THEN SEGSUP FFPG TATRAV.FFVD(IKVD)=FFPG ENDIF JDFFPG=TATRAV.DFFVD(IKVD) IF (JDFFPG.NE.0) THEN SEGSUP JDFFPG TATRAV.DFFVD(IKVD)=JDFFPG ENDIF ENDDO * SEGSUP JDTJA2 SEGSUP JXPOPG SEGSUP JXCOPG SEGDES SFAVOL SEGSUP JDTJAC SEGSUP JMAJAC SEGSUP JMIJAC 12 CONTINUE * SEGPRT,JMTLIA SEGDES FACVOL SEGDES SFACTI SEGDES SOUGEO 1 CONTINUE * DO IJVD=1,JGVD MYMCHA=TATRAV.IVD(IJVD) IF (MYMCHA.NE.0) THEN SEGDES MYMCHA ENDIF ENDDO * SEGDES TABVC.NOMVC(*) SEGDES ICOOR SEGDES MYPGS * Cette instruction n'a pas l'air de fonctionner * Un peu de ménage là où il n'y a pas d'info * SEGDES TABMAT.VMAT(*) DO IVARPR=1,NUMVPR DO IVARDU=1,NUMVDU SEGACT MYMCHA LVID=.TRUE. DO ISOUS=1,NBSOUV MCHEVA=MYMCHA.ICHEVA(ISOUS) LVID=LVID.AND.(MCHEVA.EQ.0) ENDDO IF (LVID) THEN SEGSUP MYMCHA ELSE SEGDES,MYMCHA ENDIF ENDDO ENDDO SEGDES TATRAV SEGDES TABMAT SEGDES TABVDC SEGDES TABGEO SEGDES FACTIV SEGDES CGEOME * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9666 CONTINUE IRET=666 RETURN 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine nlia' RETURN * * End of subroutine nlia * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales