C LIALIN SOURCE GOUNAND 06/08/04 21:17:04 5520 SUBROUTINE LIALIN(JXPOPG, $ FVPR,FVDU,FCPR,FCDU, $ KDERPR,KDERDU, $ JDTJA2,SSFACT,NBELEF,LERF,IESREF, $ JMTLIA, $ IMPR,IRET) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : LIALIN C DESCRIPTION : 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 : LIALI1 (calcul de JMTLIA (fortran 77)) C APPELE PAR : NLIA C*********************************************************************** C ENTREES : C ENTREES/SORTIES : C SORTIES : - C TRAVAIL : C*********************************************************************** 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 CCOPTIO CBEGININCLUDE SMCHAEL SEGMENT MCHAEL POINTEUR IMACHE(N1).MELEME POINTEUR ICHEVA(N1).MCHEVA ENDSEGMENT SEGMENT MCHEVA REAL*8 VELCHE(NBLIG,NBCOL,N2LIG,N2COL,NBPOI,NBELM) ENDSEGMENT SEGMENT LCHEVA POINTEUR LISCHE(NBCHE).MCHEVA ENDSEGMENT CENDINCLUDE SMCHAEL INTEGER NBLIG,NBCOL,N2LIG,N2COL,NBPOI,NBELM POINTEUR JXPOPG.MCHEVA POINTEUR FVPR.MCHEVA,FVDU.MCHEVA POINTEUR FCPR.MCHEVA,FCDU.MCHEVA POINTEUR JDTJA2.MCHEVA POINTEUR JMTLIA.MCHEVA CBEGININCLUDE SFACTIV SEGMENT FACTIV POINTEUR IFACTI(NBSOUV).SFACTI ENDSEGMENT SEGMENT SFACTI POINTEUR ISFACT(NBSOFV).SSFACT ENDSEGMENT SEGMENT SSFACT LOGICAL LFACTI(NBELFV,NBELEV) ENDSEGMENT CENDINCLUDE SFACTIV * INTEGER KDERPR,KDERDU INTEGER LERF INTEGER IMPR,IRET * INTEGER NDLIG,NDCOL,N2DLIG,N2DCOL,NDNOEU,NDELM INTEGER NLDTJ,NLMLIA INTEGER NDDLPR,NDDLDU,IESREL,NBPOGO * * Executable statements * IF (IMPR.GT.1) WRITE(IOIMP,*) 'Entrée dans lialin' * 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 SSFACT NBELFV=SSFACT.LFACTI(/1) NBELEV=SSFACT.LFACTI(/2) * SEGACT JXPOPG NDLIG=JXPOPG.VELCHE(/1) NDCOL=JXPOPG.VELCHE(/2) N2DLIG=JXPOPG.VELCHE(/3) N2DCOL=JXPOPG.VELCHE(/4) NDNOEU=JXPOPG.VELCHE(/5) NDELM=JXPOPG.VELCHE(/6) IF (NDLIG.NE.1.OR.NDCOL.NE.1.OR.N2DLIG.NE.1 $ .OR.N2DCOL.NE.1.OR.NDELM.NE.1) THEN WRITE(IOIMP,*) 'Erreur dims JXPOPG' GOTO 9999 ENDIF NBPOGO=NDNOEU * SEGACT FVPR NDLIG=FVPR.VELCHE(/1) NDCOL=FVPR.VELCHE(/2) N2DLIG=FVPR.VELCHE(/3) N2DCOL=FVPR.VELCHE(/4) NDNOEU=FVPR.VELCHE(/5) NDELM=FVPR.VELCHE(/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.(.NOT.(NDELM.EQ.1.OR.(KDERPR.NE.0.AND.NDELM.EQ.NBELEF) $ .OR.(KDERPR.EQ.0.AND.NDELM.EQ.NBELFV) $ ))) THEN WRITE(IOIMP,*) 'FVPR=',FVPR WRITE(IOIMP,*) 'KDERPR=',KDERPR WRITE(IOIMP,*) 'IESREL=',IESREL WRITE(IOIMP,*) 'NBPOGO=',NBPOGO WRITE(IOIMP,*) 'NBELEF=',NBELEF WRITE(IOIMP,*) 'NBELFV=',NBELFV 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,*) 'Erreur dims FVPR' GOTO 9999 ENDIF NDDLPR=NDCOL N2FVPR=N2DCOL NPFVPR=NDNOEU NLFVPR=NDELM * SEGACT FVDU NDLIG=FVDU.VELCHE(/1) NDCOL=FVDU.VELCHE(/2) N2DLIG=FVDU.VELCHE(/3) N2DCOL=FVDU.VELCHE(/4) NDNOEU=FVDU.VELCHE(/5) NDELM=FVDU.VELCHE(/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.(.NOT.(NDELM.EQ.1.OR.(KDERDU.NE.0.AND.NDELM.EQ.NBELEF) $ .OR.(KDERDU.EQ.0.AND.NDELM.EQ.NBELFV) $ ))) THEN WRITE(IOIMP,*) 'FVDU=',FVDU WRITE(IOIMP,*) 'KDERDU=',KDERDU WRITE(IOIMP,*) 'IESREL=',IESREL WRITE(IOIMP,*) 'NBPOGO=',NBPOGO WRITE(IOIMP,*) 'NBELEF=',NBELEF WRITE(IOIMP,*) 'NBELFV=',NBELFV 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,*) 'Erreur dims FVDU' GOTO 9999 ENDIF NDDLDU=NDCOL N2FVDU=N2DCOL NPFVDU=NDNOEU NLFVDU=NDELM * SEGACT FCPR NDLIG =FCPR.VELCHE(/1) NDCOL =FCPR.VELCHE(/2) N2DLIG=FCPR.VELCHE(/3) N2DCOL=FCPR.VELCHE(/4) NDNOEU=FCPR.VELCHE(/5) NDELM =FCPR.VELCHE(/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.NBELEF)) THEN WRITE(IOIMP,*) 'Erreur dims FCPR' GOTO 9999 ENDIF NPFCPR=NDNOEU NLFCPR=NDELM * SEGACT FCDU NDLIG =FCDU.VELCHE(/1) NDCOL =FCDU.VELCHE(/2) N2DLIG=FCDU.VELCHE(/3) N2DCOL=FCDU.VELCHE(/4) NDNOEU=FCDU.VELCHE(/5) NDELM =FCDU.VELCHE(/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.NBELEF)) THEN 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,*) 'Erreur dims FCDU' GOTO 9999 ENDIF NPFCDU=NDNOEU NLFCDU=NDELM * SEGACT JDTJA2 NDLIG=JDTJA2.VELCHE(/1) NDCOL=JDTJA2.VELCHE(/2) N2DLIG=JDTJA2.VELCHE(/3) N2DCOL=JDTJA2.VELCHE(/4) NDNOEU=JDTJA2.VELCHE(/5) NDELM=JDTJA2.VELCHE(/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.NBELEF)) THEN WRITE(IOIMP,*) 'Erreur dims JDTJA2' GOTO 9999 ENDIF NPDTJ=NDNOEU NLDTJ=NDELM * IF (JMTLIA.EQ.0) THEN NBLIG=NDDLDU NBCOL=NDDLPR N2LIG=1 N2COL=1 NBPOI=1 NBELM=NBELEV SEGINI JMTLIA ELSE SEGACT JMTLIA*MOD NDLIG=JMTLIA.VELCHE(/1) NDCOL=JMTLIA.VELCHE(/2) N2DLIG=JMTLIA.VELCHE(/3) N2DCOL=JMTLIA.VELCHE(/4) NDNOEU=JMTLIA.VELCHE(/5) NDELM=JMTLIA.VELCHE(/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.NBELEV)) THEN WRITE(IOIMP,*) 'Erreur dims JMTLIA' GOTO 9999 ENDIF ENDIF * KDFRPR=MAX(1,KDERPR) KDFRDU=MAX(1,KDERDU) * * On effectue le calcul de la matrice de moindres carrés * CALL LIALI1(NDDLPR,NDDLDU,NBPOGO, $ N2FVPR,N2FVDU, $ NPFVPR,NPFVDU,NPFCPR,NPFCDU,NPDTJ, $ NLFVPR,NLFVDU,NLFCPR,NLFCDU,NLDTJ, $ KDFRPR,KDFRDU, $ KDERPR,KDERDU, $ JXPOPG.VELCHE, $ FVPR.VELCHE,FVDU.VELCHE,FCPR.VELCHE,FCDU.VELCHE, $ JDTJA2.VELCHE,SSFACT.LFACTI,NBELEV,NBELFV,LERF, $ JMTLIA.VELCHE, $ IMPR,IRET) IF (IRET.NE.0) GOTO 9999 * SEGDES JMTLIA SEGDES JMTLIA SEGDES JDTJA2 SEGDES FCDU SEGDES FCPR SEGDES FVDU SEGDES FVPR SEGDES JXPOPG SEGDES SSFACT * * Normal termination * IRET=0 RETURN * * Format handling * * * Error handling * 9999 CONTINUE IRET=1 WRITE(IOIMP,*) 'An error was detected in subroutine lialin' RETURN * * End of subroutine LIALIN * END