rleca1
C RLECA1 SOURCE CHAT 05/01/13 03:01:02 5004 C************************************************************************ C C PROJET : CASTEM 2000 C C NOM : RLECA1 C C DESCRIPTION : Appelle par GRADIA C C LANGAGE : FORTRAN 77 + ESOPE 2000 (avec extensions CISI) C C AUTEUR : A. BECCANTINI C C************************************************************************ C C Inputs: C C MELFL : MELEME FACEL C C MELFP : MELEME FACEP C C Outputs: C C MLEFSC : list of FACES points and their neighbors (CENTRE and SOMMET C points) C C MACOE1 : coeff. for linear exact reconstruction of MLEFSC C C C**** Variables de COOPTIO C C INTEGER IPLLB, IERPER, IERMAX, IERR, INTERR C & ,IOTER, IOLEC, IOIMP, IOCAR, IOACQ C & ,IOPER, IOSGB, IOGRA, IOSAU, IORES C & ,IECHO, IIMPI, IOSPI C & ,IDIM CC & ,MCOORD C & ,IFOMOD, NIFOUR, IFOUR, NSDPGE, IONIVE C & ,NGMAXY, IZROSF, ISOTYP, IOSCR,LTEXLU C & ,NORINC,NORVAL,NORIND,NORVAD C & ,NUCROU, IPSAUV, IFICLE, IPREFI C IMPLICIT INTEGER(I-N) -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMELEME POINTEUR MELFL.MELEME,MELFP.MELEME,MELFP1.MELEME INTEGER JG -INC SMLENTI POINTEUR MLEFP.MLENTI -INC SMLREEL POINTEUR MLRSIG.MLREEL, MLRTRA.MLREEL & ,MTAA.MATRIX, MINTAA.MATRIX,MLRIN1.MLREEL,MLRIN2.MLREEL & ,MLRIN3.MLREEL C INTEGER NBL, NBTPOI SEGMENT MLELEM INTEGER INDEX(NBL+1) INTEGER LESPOI(NBTPOI) ENDSEGMENT POINTEUR MLEFSC.MLELEM C INTEGER N1,N2 SEGMENT MATRIX REAL*8 MAT(N1,N2) ENDSEGMENT POINTEUR MATA.MATRIX,MATU.MATRIX,MATV.MATRIX & ,MACOE1.MATRIX LOGICAL LOGSVD C INTEGER NBSOUS, NVMAX, NELT, NNOE, ISOUS, NVMIN, NVOI, IELEM & , IPOS, IELEM1,NGF,NGF1, NGN, IPCOOR, I1, I2, I3, IPVOI & , IERSVD, NGCD, NGCG, IVOI,IERR0,I4 REAL*8 ERRTOL,SMAX,SMIN, XF, YF, ZF PARAMETER (ERRTOL=1.0D0-15) C NBL = 0 NBTPOI = 0 NVMAX = 0 SEGACT MELFP NBSOUS=MELFP.LISOUS(/1) C NBSOUS=0 fais un peux chier! JG=MAX(NBSOUS,1) SEGINI MLEFP IF(NBSOUS .EQ. 0)THEN MLEFP.LECT(1)=MELFP ELSE DO ISOUS=1,NBSOUS,1 MLEFP.LECT(ISOUS)=MELFP.LISOUS(ISOUS) ENDDO ENDIF SEGDES MELFP NBSOUS=JG C DO ISOUS=1,NBSOUS,1 MELFP1=MLEFP.LECT(ISOUS) SEGACT MELFP1 NNOE=MELFP1.NUM(/1)-1 NELT=MELFP1.NUM(/2) NBTPOI=NBTPOI+((1+2+NNOE)*NELT) C C 1 = centre de face C 2 = centre d'elts "gauche" et "droite" (si differents) C NNOE = sommet voisins C NBL=NBL+NELT NVMAX=MAX(NVMAX,(2+NNOE)) ENDDO C C N.B.: NBTPOI surestimé C C**** MLEFSC C Structure Face-(Sommets-Centres) C SEGINI MLEFSC C C**** La matrice de coeff. C C MACOE1(*,I) = coefficients concernants MLEFSC.LESPOI(I) C NVMIN=IDIM+1 C C**** NVMIN = nombre minimum de voisins au dessus duquel MATA est C singulier C N1=NVMIN N2=NBTPOI SEGINI MACOE1 C C**** MATA = matrice à inverser (NVMAX,IDIM+1) C MATU = matice des vectors propres singuliers droite de MATA C (NVMAX,IDIM+1) C MATV = matrice des vectors propres singuliers gauche de MATA C (IDIM+1,IDIM+1) C Mais en INVSVD a dimension NVMAX,IDIM+1 C MLRSIG =liste des valeurs singuliers de MATA C C N.B. MATA = MATU MATSIG t(MATV) C Si MATA non singulier C inv(MATA) = MATV inv(MATSIG) t(MATU) C N1=NVMAX N2=NVMIN SEGINI MATA SEGINI MATU SEGINI MATV JG=NVMIN SEGINI MLRSIG SEGINI MLRTRA C MLRTRA segment de travail de la subroutine invsvd C C MTAA : [t(MATA).MATA] C MINTAA : [inve(t(MATA) MATA)] C MLRIN1,2,3 : "temporary vectors" C N1=NVMIN N2=NVMIN SEGINI MTAA SEGINI MINTAA JG=NVMIN SEGINI MLRIN1 SEGINI MLRIN2 SEGINI MLRIN3 C SEGACT MELFL MLEFSC.INDEX(1)=1 IELEM=0 DO ISOUS=1,NBSOUS,1 MELFP1=MLEFP.LECT(ISOUS) NNOE=MELFP1.NUM(/1)-1 NELT=MELFP1.NUM(/2) DO IELEM1=1,NELT,1 IELEM=IELEM+1 IPOS=MLEFSC.INDEX(IELEM) NGF=MELFP1.NUM(NNOE+1,IELEM1) NGF1=MELFL.NUM(2,IELEM) IF(NGF .NE. NGF1)THEN WRITE(IOIMP,*) 'subroutine rleca1.eso' GOTO 9999 ENDIF IPCOOR=(IDIM+1)*(NGF-1)+1 XF=MCOORD.XCOOR(IPCOOR) YF=MCOORD.XCOOR(IPCOOR+1) IF(IDIM .EQ. 3) ZF=MCOORD.XCOOR(IPCOOR+2) MLEFSC.LESPOI(IPOS)=NGF DO I1 = 1, NVMIN, 1 MACOE1.MAT(I1,IPOS)=0.0D0 ENDDO C C********** Le centre "gauche" C NGCG=MELFL.NUM(1,IELEM) NGN=NGCG C NVOI=nombre de voisins NVOI=1 MLEFSC.LESPOI(IPOS+1)=NGN MATA.MAT(1,1)=1.0D0 IPCOOR=(IDIM+1)*(NGN-1)+1 MATA.MAT(1,2)=MCOORD.XCOOR(IPCOOR)-XF MATA.MAT(1,3)=MCOORD.XCOOR(IPCOOR+1)-YF IF(IDIM.EQ.3) MATA.MAT(1,4)=MCOORD.XCOOR(IPCOOR+2)-ZF C C********** Le centre "droite" C NGCD=MELFL.NUM(3,IELEM) IF(NGCD .NE. NGCG)THEN NVOI=NVOI+1 NGN=NGCD MLEFSC.LESPOI(IPOS+2)=NGN MATA.MAT(2,1)=1.0D0 IPCOOR=(IDIM+1)*(NGN-1)+1 MATA.MAT(2,2)=MCOORD.XCOOR(IPCOOR)-XF MATA.MAT(2,3)=MCOORD.XCOOR(IPCOOR+1)-YF IF(IDIM.EQ.3) MATA.MAT(2,4)=MCOORD.XCOOR(IPCOOR+2)-ZF ENDIF C C********** Les sommets C DO I1 = 1, NNOE, 1 NGN=MELFP1.NUM(I1,IELEM1) MLEFSC.LESPOI(IPOS+NVOI+I1)=NGN MATA.MAT(NVOI+I1,1)=1.0D0 IPCOOR=(IDIM+1)*(NGN-1)+1 MATA.MAT(NVOI+I1,2)=MCOORD.XCOOR(IPCOOR)-XF MATA.MAT(NVOI+I1,3)=MCOORD.XCOOR(IPCOOR+1)-YF IF(IDIM.EQ.3) MATA.MAT(NVOI+I1,4)=MCOORD.XCOOR(IPCOOR+2) & -ZF ENDDO NVOI=NVOI+NNOE MLEFSC.INDEX(IELEM+1)=IPOS+NVOI+1 C LOGSVD=.TRUE. IF(IERSVD.NE.0)THEN LOGSVD=.FALSE. ELSE SMAX=0.0D0 ENDDO SMIN=SMAX ENDDO ENDIF IF((SMIN/SMAX) .LT. ERRTOL)THEN LOGSVD=.FALSE. ENDIF C C********** We have two different cases: C LOGSVD = .TRUE. -> we have the coeff. we are looking for C LOGSVD = .FALSE. -> we have not C C LOGSVD=.FALSE. IF(LOGSVD)THEN DO I4=1,NVMIN,1 DO I3=1,NVOI,1 IPVOI=IPOS+I3 ENDDO ENDDO ENDDO ELSE WRITE (IOIMP,*) 'rleca1.eso' C 22 0 C Opération malvenue. Résultat douteux C C************* INVSVD does not worked C For each neighbor k we have to compute the solution C of C C t(MATA) MATA x = t(MATA) * b C C where b= \sum_l e_l \delta(k,l) = e_k C C To do that, we compute C C X_0 = [inve(t(MATA) MATA)] [t(MATA) * b] C C X_1 = X_0 + [inve(t(MATA) MATA)] [t(MATA) * b - C [t(MATA) MATA] X_0] C C C************* We compute [t(MATA) MATA] C We store it in the upper triangle of MTAA(NVMIN,NVMIN) C DO I1=1,NVMIN,1 ENDDO ENDDO C DO I1=1,NVMIN,1 DO I3=1,NVOI,1 ENDDO ENDDO ENDDO C C************* We compute [inve(t(MATA) MATA)] C CHOLDC stores it in the upper trianle of MINTAA(NVMIN,NVMIN) C IF(IERR0.NE.0)THEN WRITE(IOIMP,*) 'subroutine rleca1.eso.' C 26 2 C Tache impossible. Probablement données erronées GOTO 9999 ENDIF C C************* We complete MTAA and MINTAA C DO I1=1,NVMIN,1 ENDDO ENDDO C DO IVOI=1,NVOI,1 C C**************** We compute [t(MATA) . b] and we store it in MLRIN1.PROG C DO I1=1,NVMIN,1 ENDDO C C**************** X_0 = [inve(t(MATA) MATA)] [t(MATA) * b] C X_0(i1) into MLRIN2.PROG(I1) C DO I1=1,NVMIN,1 ENDDO ENDDO C C**************** X_1 = X_0 + [inve(t(MATA) MATA)] [t(MATA) * b - C [t(MATA) MATA] X_0] C C [t(MATA) MATA] X_0 into MLRIN3.PROG C DO I1=1,NVMIN,1 ENDDO ENDDO C C**************** Now we have C [t(MATA) . b] in MLRIN1.PROG C X_0(i1) in MLRIN2.PROG(I1) C [t(MATA) MATA] X_0 in MLRIN3.PROG C C X_1(i1) in MLRCOE.MAT(i1,IVOI) C IPVOI=IPOS+IVOI DO I1=1,NVMIN,1 MACOE1.MAT(I1,IPVOI)=MACOE1.MAT(I1,IPVOI)+ ENDDO MACOE1.MAT(I1,IPVOI)=MACOE1.MAT(I1,IPVOI)+ ENDDO ENDDO ENDIF C C********** If we are here, we have the coeff. in the 'FACE' frame. C ENDDO SEGDES MELFP1 ENDDO C NBTPOI=MLEFSC.INDEX(NBL+1)-1 SEGADJ MLEFSC N1=NVMIN N2=NBTPOI SEGADJ MACOE1 C SEGSUP MLEFP SEGDES MLEFSC SEGDES MACOE1 SEGSUP MATA SEGSUP MATU SEGSUP MATV SEGSUP MLRSIG SEGSUP MLRTRA C SEGDES MELFL SEGSUP MTAA SEGSUP MINTAA SEGSUP MLRIN1 SEGSUP MLRIN2 SEGSUP MLRIN3 C 9999 RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales