linlin
C LINLIN SOURCE GOUNAND 21/06/02 21:17:10 11022 $ FVPR,FVDU,FCPR,FCDU, $ KDERPR,KDERDU, $ JDTJAC,NBELEM,LERF,IESREF, $ JMTLIN, $ IMPR,IRET) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : LINLIN C DESCRIPTION : Calcul de la matrice. 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 : LINLI1 (calcul de JMTLIN (fortran 77)) C APPELE PAR : NLIN C*********************************************************************** C ENTREES : * PGCOUR (type POGAU) : méthode d'intégration pour C le maillage élémentaire courant. C * FFGPR (type MCHEVA) : valeurs des fonctions C d'interpolation aux points de gauss sur C l'élément de référence pour la variable C primale. C Structure (cf.include SMCHAEL) : C (1, nb. ddl. pri., 1, 1, nb. poi. gauss, 1) C * DFFGPR (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 pri., 1, dim.esp.réel, C nb. poi. gauss, nb. élém.) C * FFGDU (type MCHEVA) : valeurs des fonctions C d'interpolation aux points de gauss sur C l'élément de référence pour la variable C duale. C Structure (cf.include SMCHAEL) : C (1, nb. ddl. dua., 1, 1, nb. poi. gauss, 1) C * DFFGDU (type MCHEVA) : valeurs des dérivées C premières des fonctions d'interpolation C duales aux points de gauss sur l'élément C réel. C Structure (cf.include SMCHAEL) : C (1, nb. ddl dua., 1, dim.esp.réel, C nb. poi. gauss, nb. élém.) C * CFGPR (type MCHEVA) : valeurs du coefficient C aux points de Gauss sur le maillage C élémentaire pour la variable primale. C Structure (cf.include SMCHAEL) : C (1, 1, 1, 1, C nb. poi. gauss, nb. éléments) C * CFGDU (type MCHEVA) : valeurs du coefficient C aux points de Gauss sur le maillage C élémentaire pour la variable duale. C Structure (cf.include SMCHAEL) : C (1, 1, 1, 1, C nb. poi. gauss, nb. éléments) C * KDERPR (type ENTIER) : dérivation sur la C variable primale. C * KDERDU(type ENTIER) : dérivation sur la C variable duale. 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 * NBELEM (type entier) : nombre d'éléments du C maillage élémentaire courant. C ENTREES/SORTIES : * JMTLIN (type MCHEVA) : valeurs de la matrice C moindres carrés sur le maillage élémentaire. C Structure (cf.include SMCHAEL) : C (nb. ddl dual, nb. ddl primal, C 1, 1, C 1, nb. éléments) C SORTIES : - C TRAVAIL : * NDDLDU (type entier) : nb. de ddl de la C variable duale par élément. C * NDDLPR (type entier) : nb. de ddl de la C variable primale par élément. C * IESREL (type entier) : dimension de l'espace C réel (i.e. géométrique). C * NBPOGO (type entier) : nombre de points C d'intégration. C * NLDFPR (type entier) : nombre d'éléments de C DFFGPR. C * NLDFDU (type entier) : nombre d'éléments de C DFFGDU. C * NLCPR (type entier) : nombre d'éléments de C CFGPR. C * NLCDU (type entier) : nombre d'éléments de C CFGDU. C * NLDTJ (type entier) : nombre d'éléments de C JDTJAC. C Les nombres d'éléments ci-dessus valent : C - soit NBELEM ; C - soit 1 si le champ par élément est constant sur le maillage C élémentaire courant. C * NLMLIN (type entier) : nombre d'éléments de C JMTLIN. C*********************************************************************** C VERSION : v3.1, 30/07/04, possiblité de travailler C dans l'espace de référence 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 SPOGAU POINTEUR PGCOUR.POGAU *-INC SMCHAEL INTEGER NBLIG,NBCOL,N2LIG,N2COL,NBPOI,NBELM POINTEUR FVPR.MCHEVA,FVDU.MCHEVA POINTEUR FCPR.MCHEVA,FCDU.MCHEVA POINTEUR JDTJAC.MCHEVA POINTEUR JMTLIN.MCHEVA * INTEGER KDERPR,KDERDU INTEGER NBELEM INTEGER LERF INTEGER IMPR,IRET * INTEGER NDLIG,NDCOL,N2DLIG,N2DCOL,NDNOEU,NDELM INTEGER NLDTJ,NLMLIN INTEGER NDDLPR,NDDLDU,IESREL,NBPOGO * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans linlin' * IF (KDERPR.LT.0.OR.KDERPR.GT.IDIM) THEN WRITE(IOIMP,*) 'Erreur KDERPR=',KDERPR GOTO 9999 ENDIF * IF (KDERDU.LT.0.OR.KDERDU.GT.IDIM) THEN WRITE(IOIMP,*) 'Erreur KDERDU=',KDERDU GOTO 9999 ENDIF * IESREL=IDIM IF (LERF.NE.0) THEN IESDER=IESREF ELSE IESDER=IESREL ENDIF * SEGACT PGCOUR NBPOGO=PGCOUR.XPOPG(/1) * * SEGPRT,FVPR SEGACT FVPR NDLIG=FVPR.WELCHE(/1) NDCOL=FVPR.WELCHE(/2) N2DLIG=FVPR.WELCHE(/3) N2DCOL=FVPR.WELCHE(/4) NDNOEU=FVPR.WELCHE(/5) NDELM=FVPR.WELCHE(/6) IF (NDLIG.NE.1.OR.N2DLIG.NE.1.OR. $ ((N2DCOL.NE.1.AND.KDERPR.EQ.0) $ .OR.(N2DCOL.NE.IESDER.AND.KDERPR.NE.0)) $ .OR.(NDNOEU.NE.1.AND.NDNOEU.NE.NBPOGO) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NBELEM)) THEN WRITE(IOIMP,*) 'Erreur dims FVPR' GOTO 9999 ENDIF NDDLPR=NDCOL N2FVPR=N2DCOL NPFVPR=NDNOEU NLFVPR=NDELM * * SEGPRT,FVDU SEGACT FVDU NDLIG=FVDU.WELCHE(/1) NDCOL=FVDU.WELCHE(/2) N2DLIG=FVDU.WELCHE(/3) N2DCOL=FVDU.WELCHE(/4) NDNOEU=FVDU.WELCHE(/5) NDELM=FVDU.WELCHE(/6) IF (NDLIG.NE.1.OR.N2DLIG.NE.1.OR. $ ((N2DCOL.NE.1.AND.KDERDU.EQ.0) $ .OR.(N2DCOL.NE.IESDER.AND.KDERDU.NE.0)) $ .OR.(NDNOEU.NE.1.AND.NDNOEU.NE.NBPOGO) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NBELEM)) THEN WRITE(IOIMP,*) 'Erreur dims FVDU' GOTO 9999 ENDIF NDDLDU=NDCOL N2FVDU=N2DCOL NPFVDU=NDNOEU NLFVDU=NDELM * * SEGPRT,FCPR SEGACT FCPR NDLIG =FCPR.WELCHE(/1) NDCOL =FCPR.WELCHE(/2) N2DLIG=FCPR.WELCHE(/3) N2DCOL=FCPR.WELCHE(/4) NDNOEU=FCPR.WELCHE(/5) NDELM =FCPR.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.NBPOGO) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NBELEM)) THEN WRITE(IOIMP,*) 'Erreur dims FCPR' GOTO 9999 ENDIF NPFCPR=NDNOEU NLFCPR=NDELM * * SEGPRT,FCDU SEGACT FCDU NDLIG =FCDU.WELCHE(/1) NDCOL =FCDU.WELCHE(/2) N2DLIG=FCDU.WELCHE(/3) N2DCOL=FCDU.WELCHE(/4) NDNOEU=FCDU.WELCHE(/5) NDELM =FCDU.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.NBPOGO) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NBELEM)) THEN WRITE(IOIMP,*) 'Erreur dims FCDU' GOTO 9999 ENDIF NPFCDU=NDNOEU NLFCDU=NDELM * SEGACT JDTJAC NDLIG=JDTJAC.WELCHE(/1) NDCOL=JDTJAC.WELCHE(/2) N2DLIG=JDTJAC.WELCHE(/3) N2DCOL=JDTJAC.WELCHE(/4) NDNOEU=JDTJAC.WELCHE(/5) NDELM=JDTJAC.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.NBPOGO) $ .OR.(NDELM.NE.1.AND.NDELM.NE.NBELEM)) THEN WRITE(IOIMP,*) 'Erreur dims JDTJAC' GOTO 9999 ENDIF NPDTJ=NDNOEU NLDTJ=NDELM * IF (JMTLIN.EQ.0) THEN NBLIG=NDDLDU NBCOL=NDDLPR N2LIG=1 N2COL=1 NBPOI=1 NBELM=NBELEM * On pourrait aussi envisager de renvoyer une seule matrice pour le cas * où NLCFG=NLFPRG=NLFDUG=NLDTJ=1 SEGINI JMTLIN NLMLIN=NBELM ELSE SEGACT JMTLIN*MOD NDLIG=JMTLIN.WELCHE(/1) NDCOL=JMTLIN.WELCHE(/2) N2DLIG=JMTLIN.WELCHE(/3) N2DCOL=JMTLIN.WELCHE(/4) NDNOEU=JMTLIN.WELCHE(/5) NDELM=JMTLIN.WELCHE(/6) IF (NDLIG.NE.NDDLDU.OR.NDCOL.NE.NDDLPR.OR.N2DLIG.NE.1 $ .OR.N2DCOL.NE.1.OR.NDNOEU.NE.1 $ .OR.(NDELM.NE.1.AND.NDELM.NE.NBELEM)) THEN WRITE(IOIMP,*) 'Erreur dims JMTLIN' GOTO 9999 ENDIF NLMLIN=NDELM ENDIF * KDFRPR=MAX(1,KDERPR) KDFRDU=MAX(1,KDERDU) * * On effectue le calcul de la matrice de moindres carrés * $ N2FVPR,N2FVDU, $ NPFVPR,NPFVDU,NPFCPR,NPFCDU,NPDTJ, $ NLFVPR,NLFVDU,NLFCPR,NLFCDU,NLDTJ,NLMLIN, $ KDFRPR,KDFRDU, $ PGCOUR.XPOPG, $ FVPR.WELCHE,FVDU.WELCHE,FCPR.WELCHE,FCDU.WELCHE, $ JDTJAC.WELCHE,LERF,JMTLIN.WELCHE, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * SEGDES JMTLIN SEGDES JMTLIN * IMPR=6 IF (IMPR.GT.3) THEN WRITE(IOIMP,*) 'On a créé', $ ' JMTLIN(élément ,1 ,1 ,1 ,', $ ' ddl.pri , ddl.dua)' IF (IRET.NE.0) GOTO 9999 ENDIF * IMPR=0 SEGDES JDTJAC SEGDES FCDU SEGDES FCPR SEGDES FVDU SEGDES FVPR SEGDES PGCOUR * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine linlin' RETURN * * End of subroutine LINLIN * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales