rlexca
C RLEXCA SOURCE OF166741 24/12/13 21:17:28 12097 & MLESCF,MATCOE) C************************************************************************ C C PROJET : CASTEM 2000 C C NOM : RLEXCA C C DESCRIPTION : Appellé par GRADIA C C LANGAGE : FORTRAN 77 + ESOPE 2000 (avec extensions CISI) C C AUTEUR : A. BECCANTINI C C************************************************************************ C C Inputs: C C MELLIM : MELEME spg boundary conditions C C MLELSC : neighbors of SOMMETS C C MLESBC : neighbors of SOMMETS belonging to the boundary C C MLRDIS : list of distances of a boundary SOMMET and its neighbors C C Output : C C MLESCF : final list of SOMMET points and their CENTRE neighbors C C MATCOE : coefficient to compute the reconstruction C IMPLICIT INTEGER(I-N) -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMELEME POINTEUR MELLIM.MELEME C INTEGER NBL, NBTPOI SEGMENT MLELEM INTEGER INDEX(NBL+1) INTEGER LESPOI(NBTPOI) ENDSEGMENT POINTEUR MLELSC.MLELEM, MLESBC.MLELEM, MLESCF.MLELEM C INTEGER JG -INC SMLREEL POINTEUR MLRDIS.MLREEL, MLRSIG.MLREEL, MLRTRA.MLREEL -INC SMLENTI POINTEUR MLELIM.MLENTI, MLESOM.MLENTI C INTEGER N1,N2 SEGMENT MATRIX REAL*8 MAT(N1,N2) ENDSEGMENT POINTEUR MATA.MATRIX,MATU.MATRIX,MATV.MATRIX & ,MATCOE.MATRIX & ,MTAA.MATRIX, MINTAA.MATRIX,MLRIN1.MLREEL,MLRIN2.MLREEL & ,MLRIN3.MLREEL C INTEGER NTP,NBTPO1,NBL1,ISOMM,IPOS,NGS,NLS,IPOS1,NVMAX,IPOS2 & ,IPOS3,NVOI,NVMIN,NSOMM,I1,I2,I3,I4,NGC,IERSVD,NGS1,NVOIS1 & ,NLLIM,IPCOOR,IPVOI,ICEL,NVOI0,IERR0,IVOI Real*8 XC,YC,ZC,SMAX,SMIN,DIST2,DIST21,ERRTOL,XS,YS,ZS,ERRTO1 PARAMETER(ERRTOL=1.0D-15,ERRTO1=1.0D-7) LOGICAL LOGSVD C NTP=nbpts C C**** Le MELEME support de CL C IF(MELLIM.NE.0) THEN C C******* En KRIPAD C SEGACT MELLIM C SEGINI MLELIM C SEGDES MELLIM ELSE JG=NTP SEGINI MLELIM ENDIF C SEGACT MLESBC NBL1=MLESBC.INDEX(/1)-1 NBTPO1=MLESBC.LESPOI(/1) JG=NTP SEGINI MLESOM DO I1 = 1, NBL1, 1 IPOS=MLESBC.INDEX(I1) NGS=MLESBC.LESPOI(IPOS) MLESOM.LECT(NGS)=I1 ENDDO C SEGACT MLELSC NBL=MLELSC.INDEX(/1)-1 NSOMM=NBL NBTPOI=MLELSC.LESPOI(/1) NBTPOI=NBTPOI+NBTPO1-NBL1 C C**** MLESCF C Structure Sommet-Centres Finale C NBTPOI(MLESCF) <= NBTPOI (SEGADJ à la fin) C SEGINI MLESCF C C**** La matrice de coeff. C C MATCOE(*,I) = coefficients concernants MLESCF.LESPOI(I) C C NVMIN : nombre minimum de voisins que un sommet C doit avoir pour une reconstruction lineaire C exacte C N2(MATCOE) <= N2 (SEGADJ à la fin) C NVMIN=IDIM+1 N1=NVMIN N2=NBTPOI SEGINI MATCOE SEGACT MLRDIS C C**** Definition des matrices pour calculer MATCOE C Les dimensions C IPOS1=MLELSC.INDEX(1) NVMAX=0 DO ISOMM = 1, NSOMM, 1 IPOS=IPOS1 IPOS1=MLELSC.INDEX(ISOMM+1) NVOI=IPOS1-IPOS-1 NGS=MLELSC.LESPOI(IPOS) NLS=MLESOM.LECT(NGS) IF(NLS .GT. 0)THEN IPOS2=MLESBC.INDEX(NLS) IPOS3=MLESBC.INDEX(NLS+1) NVOI=NVOI+IPOS3-IPOS2-1 ENDIF NVMAX=MAX(NVMAX,NVOI) ENDDO 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 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 MLESCF.INDEX(1)=1 NBTPOI=0 DO ISOMM = 1, NSOMM, 1 IPOS=MLESCF.INDEX(ISOMM) IPOS1=MLELSC.INDEX(ISOMM) NGS=MLELSC.LESPOI(IPOS1) IPCOOR=(NGS-1)*(IDIM+1)+1 XS=MCOORD.XCOOR(IPCOOR) YS=MCOORD.XCOOR(IPCOOR+1) IF(IDIM .EQ. 3) ZS=MCOORD.XCOOR(IPCOOR+2) MLESCF.LESPOI(IPOS)=NGS NLLIM=MLELIM.LECT(NGS) IF(NLLIM.GT.0)THEN C C********** NGS est un noeud du MELEME des conditions C limites C MLESCF.INDEX(ISOMM+1)=IPOS+1 MATCOE.MAT(1,IPOS)=1.0D0 ENDDO NBTPOI=NBTPOI+1 C C********** On passe au sommet suivant (i.e. ISOMM->ISOMM+1) C ELSE ENDDO NLS=MLESOM.LECT(NGS) NVOI=MLELSC.INDEX(ISOMM+1)-IPOS1-1 NVOI0=NVOI C NVOI0 = nombre de centre voisins directe! IPCOOR=(NGC-1)*(IDIM+1)+1 XC=MCOORD.XCOOR(IPCOOR) YC=MCOORD.XCOOR(IPCOOR+1) IF(IDIM.EQ.3)THEN ZC=MCOORD.XCOOR(IPCOOR+2) ENDIF ENDDO IF(NLS.EQ.0)THEN C C************* NGS est un noeud À l'interieur du domaine C LOGSVD=.TRUE. IF(IERSVD.NE.0)THEN C INVSVD did not work LOGSVD=.FALSE. ELSE SMAX=0.0D0 ENDDO SMIN=SMAX ENDDO ENDIF IF((SMIN/SMAX) .LT. ERRTOL)THEN C INVSVD did not work LOGSVD=.FALSE. ENDIF ELSE C C************* NGS est un noeud sur le bord mais pas un noeud des C conditions limites C IPVOI=MLESBC.INDEX(NLS) NGS1=MLESBC.LESPOI(IPVOI) NVOIS1=MLESBC.INDEX(NLS+1)-IPVOI-1 IF((NVOIS1.LE.0).OR.(NGS .NE. NGS1))THEN WRITE(IOIMP,*) 'Subroutine rlexca.eso.' GOTO 9999 ENDIF ICEL=1 C C************* Repeat until C 10 CONTINUE NGC=MLESBC.LESPOI(IPVOI+ICEL) IF((DIST21.LT.DIST2) .OR. (NVOI .LT. NVMIN))THEN NVOI=NVOI+1 MLESCF.LESPOI(IPOS+NVOI)=NGC IPCOOR=(NGC-1)*(IDIM+1)+1 XC=MCOORD.XCOOR(IPCOOR) YC=MCOORD.XCOOR(IPCOOR+1) MATA.MAT(NVOI,1)=1 MATA.MAT(NVOI,2)=XC-XS MATA.MAT(NVOI,3)=YC-YS IF(IDIM.EQ.3)THEN ZC=MCOORD.XCOOR(IPCOOR+2) MATA.MAT(NVOI,4)=ZC-ZS ENDIF ICEL=ICEL+1 DIST2=DIST21*1.10D0 IF(ICEL .LE. NVOIS1) GOTO 10 ENDIF LOGSVD=.TRUE. IF(IERSVD.NE.0)THEN SMIN=0.0D0 SMAX=1.0D0 ELSE SMAX=0.0D0 ENDDO SMIN=SMAX ENDDO ENDIF IF((SMIN/SMAX) .LT. ERRTO1)THEN C C**************** We add other neighbors C ICEL=NVOI-NVOI0 IF(ICEL.LT.NVOIS1)THEN ICEL=ICEL+1 NGC=MLESBC.LESPOI(IPVOI+ICEL) GOTO 10 ELSE IF((SMIN/SMAX) .LT. (ERRTOL))THEN LOGSVD=.FALSE. ENDIF ENDIF ENDIF C C************* Fin repeat until C 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 IF(LOGSVD)THEN DO I4=1,NVMIN,1 DO I3=1,NVOI,1 IPVOI=IPOS+I3 ENDDO ENDDO ENDDO ELSE WRITE (IOIMP,*) 'rlexca.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 rlexca.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 MATCOE.MAT(I1,IPVOI)=MATCOE.MAT(I1,IPVOI)+ ENDDO MATCOE.MAT(I1,IPVOI)=MATCOE.MAT(I1,IPVOI)+ ENDDO ENDDO ENDIF CC TEST C if(isomm .eq. (nsomm - 1))then C write(*,*) 'ngs =', NGS C write(*,*) 'invide',LOGSVD C write(*,*) 'coeff(1) =',(matcoe.mat(1,ipos+ivoi),ivoi=1 C $ ,nvoi,1) C write(*,*) 'coeff(2) =',(matcoe.mat(2,ipos+ivoi),ivoi=1 C $ ,nvoi,1) C write(*,*) 'coeff(3) =',(matcoe.mat(3,ipos+ivoi),ivoi=1 C $ ,nvoi,1) C if(idim.eq.3) write(*,*) 'coeff(3)=' C & ,(matcoe.mat(4,ipos+ivoi),ivoi=1,nvoi,1) C dist2=0.0D0 C do ivoi=1,nvoi,1 C dist2=dist2+matcoe.mat(1,ipos+ivoi) C enddo C write(*,*) 'sum=',dist2 CC C call erreur(21) C goto 9999 C endif C C********** If we are here, we have the coeff. in the 'SOMMET' frame. C C NBTPOI=NBTPOI+NVOI+1 MLESCF.INDEX(ISOMM+1)=IPOS+NVOI+1 ENDIF ENDDO C SEGADJ MLESCF SEGDES MLESCF C N2=NBTPOI SEGADJ MATCOE SEGDES MATCOE C IF(MELLIM .NE. 0) SEGDES MELLIM SEGSUP MLELIM SEGSUP MLESBC SEGSUP MLESOM SEGSUP MLELSC SEGSUP MLRDIS SEGSUP MATA SEGSUP MATU SEGSUP MATV SEGSUP MLRSIG SEGSUP MLRTRA C SEGSUP MTAA SEGSUP MINTAA SEGSUP MLRIN1 SEGSUP MLRIN2 SEGSUP MLRIN3 C 9999 RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales