rleca1
C RLECA1 SOURCE OF166741 24/12/13 21:17:22 12097
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
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