Download simul3.eso

Back to the list

   1 : C SIMUL3    SOURCE    BP208322  12/02/16    21:15:04     7283           
   2 :       SUBROUTINE SIMUL3 (IPKW2M,IPMASS,IPVALP,IPHI,IPERM,NMOD,nbonve,
   3 :      $                   Nramax,IPSOLU,LIMAGE)
   4 : c      $                   nbonZ,nrate,IPSOLU,LIMAGE)
   5 : ***********************************************************************
   6 : *                                                                      
   7 : *                             S I M U L 3                              
   8 : *                             -----------                              
   9 : *                                                                      
  10 : * FONCTION:                                                            
  11 : * ---------                                                            
  12 : *                                                                      
  13 : *     APPELE PAR LE SOUS-PROGRAMME "SIMUL1".
  14 : *     CALCUL DES VECTEURS PROPRES.                                     
  15 : *     (VIBRATIONS - OPTION SIMULTANE)                                  
  16 : *                                                                      
  17 : *                                                                      
  18 : * PARAMETRES:   (E)=ENTREE   (S)=SORTIE                                
  19 : * -----------                                                          
  20 : *                                                                      
  21 : *     IPKW2M  (E)  POINTEUR DE L'OBJET 'RIGIDITE' K-w^2*M  
  22 : *     IPMASS  (E)  POINTEUR DE L'OBJET 'RIGIDITE' M  
  23 : *     IPVALP  (E)  POINTEUR DE L'OBJET 'LISTREEL' CONTENANT LA SUITE   
  24 : *                  DE VALEURS PROPRES DU PETIT PROBLEME AUX VALEURS    
  25 : *                  PROPRES.  
  26 : *     IPHI    (E)  POINTEUR DE L'OBJET MATRIX des coef des vect propres
  27 : *     IPERM   (E)  LISTENTIER pour ordonner les vect p comme les val p
  28 : *     NMOD    (E)  NOMBRE DE MODES PROPRES DEMANDE.  
  29 : *     nbonve  (E)  NOMBRE DE MODES ESTIMES CONVERGES PAR SIMU21
  30 : *     IPSOLU  (S)  POINTEUR DE L'OBJET 'SOLUTION' CONTENANT LA SUITE   
  31 : *                  DE MODES PROPRES SOLUTIONS.                         
  32 : *     LIMAGE  (E)  LOGICAL =vrai si valeurs propres negatives
  33 : *                  (matrice K non definie positive par ex.)
  34 : *                                                                      
  35 : *     + PARAMETRES PASSES PAR LE COMMON "CSIMUL".                      
  36 : *                                                                      
  37 : * DESCRIPTION DES VARIABLES : cf. commentaires au cours du programme
  38 : * --------------------------
  39 : *                                                                      
  40 : * MODE DE FONCTIONNEMENT:
  41 : * -----------------------
  42 : *     -DEDUCTION DES FREQUENCES PROPRES DU PROBLEME PHYSIQUE,
  43 : *     -RECOMBINAISON DES VECTEURS PROPRES Z=X*PHI,
  44 : *     -CALCUL DU RESIDU, 
  45 : *      si(cvgce): ORTHOGONALISATION % MODES DEJA CONVERGES
  46 : *      sinon:     2 ITERATIONS INVERSES + ORTHOGONALISATION
  47 : *     -CREATION OU COMPLETION DE L'OBJET "SOLUTION" IPSOLU via SIMUL6                                                                 
  48 : *                                                                      
  49 : * LANGAGE : ESOPE (FORTRAN77)
  50 : *     
  51 : ************************************************************************
  52 : *                                                                      
  53 :       IMPLICIT INTEGER(I-N)
  54 :       IMPLICIT REAL*8(A-H,O-Z)
  55 : -INC CCREEL
  56 : -INC CCOPTIO                                                           
  57 : -INC SMLREEL                                                           
  58 : -INC SMLENTI                                                           
  59 : -INC SMVECTD
  60 : -INC SMRIGID
  61 : *                                                                      
  62 : *     REGOUPEMENT DE RENSEIGNEMENTS POUR "LANCZO" et "SIMUL.":
  63 :       COMMON/CSIMUL/ W2SHIF,XPREC21,mvecri,IPVECX,IPVECZ,IPMZ,IPFREZ    
  64 :       REAL*8 W2SHIF,ZTMZ,XPREC21,XORTHO
  65 :       REAL*8 DEUXPI
  66 :       PARAMETER (DEUXPI = (2.D0*XPI))
  67 :       
  68 :       SEGMENT MATRIX 
  69 :        REAL*8 A(N,N) 
  70 :       ENDSEGMENT
  71 :       POINTEUR IPHI.MATRIX             
  72 :       pointeur mlent5.mlenti,mlent6.mlenti,mlent7.mlenti
  73 :       pointeur mvect5.MVECTD,mvect6.MVECTD,mvect7.MVECTD
  74 :       pointeur mvect4.MVECTD
  75 :       
  76 :       PARAMETER (LPROPR = 5)                                                    
  77 :       LOGICAL CONVRG                                                            
  78 :       REAL*8 PROPRE(LPROPR)                                                     
  79 : *                                                                      
  80 : *                                                                      
  81 :       REAL*8 VALPP,FREP,W2,W2CALC                                  
  82 : *                                                                      
  83 :                                                             
  84 : *                                                                      
  85 : ***********************************************************************
  86 : *
  87 :       LOGICAL LIMAGE
  88 : *
  89 : *---------------------------------------------------------------------*                                                                      
  90 : *     -- INITIALISATIONS --                                            
  91 : *---------------------------------------------------------------------*                                                                      
  92 : *                                                                      
  93 : c inutile car fait par simul1 lorsqu on shifte:     IPSOLU = 0
  94 : *                                                                      
  95 :       MLREEL=IPVALP                                                    
  96 :       SEGACT,MLREEL  
  97 :       NMODMAX= PROG(/1)
  98 :       MLENTI=IPERM
  99 :       SEGACT,MLENTI 
 100 :       SEGACT,IPHI
 101 :       N=IPHI.A(/1)
 102 : *     recup des vecteurs de Lanczos de ce cycle      
 103 :       mlent3 = IPVECX
 104 :       NVEC3  = mlent3.lect(/1)
 105 :       mvect3 = mlent3.lect(1)
 106 :       inc = mvect3.VECTBB(/1)
 107 :       
 108 : *     recup des modes deja convergés aux précédents cycles (=IPVECZ)
 109 :       if (IPVECZ.ne.0) then
 110 :         mlent5 = IPVECZ
 111 :         mlent6 = IPMZ
 112 :         mlree1 = IPFREZ
 113 :         segact,mlent5*mod
 114 :         JG0 = mlent5.LECT(/1)
 115 : c         JG = JG0 + nbonve
 116 :         JG = JG0 + NMODMAX
 117 :         segadj,mlent5
 118 :         segadj,mlent6
 119 :         segadj,mlree1
 120 :         segact,mlent5*mod
 121 :         segact,mlent6*mod
 122 :         segact,mlree1*mod
 123 : *     creation des modes convergés (=IPVECZ)
 124 :       else
 125 :         JG0 = 0
 126 : c         JG = nbonve
 127 :         JG = NMODMAX
 128 :         segini,mlent5
 129 :         IPVECZ = mlent5
 130 :         segini,mlent6
 131 :         IPMZ = mlent6
 132 :         segini,mlree1
 133 :         IPFREZ = mlree1
 134 :       endif 
 135 :       
 136 : c     on considere qu il faut reorthognaliser si le produit scalaire 
 137 : c     est > XORTHO (avec **1.6 XORTHO=3E-13 si xprec21=1.5E-8)       
 138 :       XORTHO = XPREC21**1.6
 139 : c c     on ne fait meme pas d iterations inverses si residu trop grand      
 140 : c       XRMAX = sqrt(XPREC21)
 141 : c => mauvaise idée pour dyne_devo_10.dgibi
 142 : c     limite pour detecter la presence dans la solution      
 143 : c       RLIM = 1.D-5
 144 :       RLIM = sqrt(XPREC21)
 145 :       
 146 :       IF (IIMPI .ge. 6) THEN
 147 :       WRITE(IOIMP,*) '------------------- simul3 ---------------------'
 148 :       WRITE(IOIMP,*) 'candidat| mode    |    freq    |  residu relatif'
 149 :       ENDIF
 150 :       
 151 : c       -recup de icholi pour le passage vecteur <-> chpoint
 152 :          mrigid = IPKW2M
 153 :          segact,mrigid
 154 :          icholi = ichole 
 155 :          segdes,mrigid
 155 : c       call gibtem(xkt30) 
 156 : c       WRITE(IOIMP,*) '=> simul3        xkt30=',xkt30
 157 : 
 158 : c     shift utilise pour ce cycle
 159 :       FRSHIF = (sqrt(abs(W2SHIF))) / DEUXPI
 160 : *
 161 : *---------------------------------------------------------------------*                                                                      
 162 : *     -- Boucle sur les candidats a devenir des modes --
 163 : *---------------------------------------------------------------------*                                                                      
 164 : *
 165 : c     Au min, On teste les NMOD demandés ou nbonve supposé convergés
 166 :       NMODIN = MAX(nbonve,NMOD)
 167 : c     Au max, On teste tous les candidats (tant que ca converge)
 168 : c       N105 = MIN(nbonve,NMODMAX)
 169 :       N105 = NMODMAX
 170 : c     Nombre de modes ratés, convergés        
 171 : c       NRATE = 0      
 172 :       IEME = 0 
 173 :       
 174 :       DO 105 IB105 = 1, N105                                      
 175 : *                                                                      
 176 :          IEME = IEME + 1
 177 : *                                                                      
 178 : *------- RETOUR AU PROBLEME PHYSIQUE INITIAL -------------------------*
 179 : *                                                                      
 180 : *       -IEME FREQUENCE PROPRE:                                             
 181 :          VALPP = PROG(IB105)                                            
 182 :          W2CALC = VALPP                                                
 182 :          CALL W2FREQ(W2CALC,W2SHIF, W2,FREP,LIMAGE)
 183 :          IF(IERR .NE. 0) RETURN                                       
 184 : *                                                                      
 185 : *       -IEME VECTEUR PROPRE:
 186 :          segini,mvect1
 187 :          IEME2 = LECT(IB105)
 188 :          DO jvec=1,N
 189 :             XPHI = IPHI.A(jvec,IEME2)
 190 :             mvect3 = mlent3.lect(jvec)
 191 :             do i=1,inc
 192 :                mvect1.VECTBB(i) = mvect1.VECTBB(i) 
 193 :      $                   + ((mvect3.VECTBB(i)) * XPHI)
 194 :             enddo           
 195 :          ENDDO         
 196 : 
 197 : *       -creation du chpoint
 197 :          call crech2(IPVECP,mvect1,mvecri,1)
 198 :          segact,mvect1*mod
 198 : c       call gibtem(xkt30z) 
 199 : c       WRITE(IOIMP,*) '=> simul3  z=x*p xkt30=',xkt30z
 200 :          
 201 :          IF (IIMPI .EQ. 369) THEN                                      
 202 :             WRITE (IOIMP,*) 'simul3: VECTEUR PROPRE PHYSIQUE_',IEME     
 202 :             CALL ECCHPO (IPVECP,0)                                     
 203 :          ENDIF  
 204 :          
 205 : *        on suppose qu on a convergé
 206 :          CONVRG = .true.
 207 : 
 208 : *
 209 : *------- CALCUL DU RESIDU --------------------------------------------*
 210 : *
 211 : *lorsqu on n est pas sur de la convergence on teste directement le residu
 212 :          
 213 : *parfois, il est necessaire d iterer un peu pour "purger" la solution
 214 :          N101 = 3
 215 : c          N101 = 2
 216 :          I101 = 0
 217 :   101    CONTINUE
 218 :          I101 = I101 + 1
 219 : *
 220 : c       -calcul de [K-w^2M]*Z
 220 :          call MUCPRI(IPVECP,IPKW2M,IPKV1)
 220 :          call chv2(icholi,IPKV1,mvect4,1)
 220 :          call dtchpo(IPKV1)
 221 : c       -calcul de MZ
 221 :          call MUCPRI(IPVECP,IPMASS,IPMV1)
 221 :          call chv2(icholi,IPMV1,mvect2,1)
 222 :           
 223 : *       -calcul de (Z^T.M.Z)
 224 :          ZTMZ = 0.D0
 225 :          do i=1,inc
 226 :             ZTMZ = ZTMZ + (mvect2.vectbb(i)*mvect1.vectbb(i))
 227 :          enddo
 228 :          
 229 : c       -calcul du coef de Rayleigh ZRAY1 = Z^T K Z / Z^T M Z 
 230 : c       (est notamment utile lorsqu'on a fait appel a itinv)
 231 :          IF (.NOT.CONVRG) THEN   
 232 :            ZNUM1 = 0.D0
 233 :            ZDEN1 = ZTMZ
 234 : c            ZDEN1 = 0.D0
 235 :            do i=1,inc
 236 :               ZNUM1 = ZNUM1 + (mvect1.VECTBB(i)*mvect4.VECTBB(i))
 237 : c               ZDEN1 = ZDEN1 + (mvect1.VECTBB(i)*mvect2.VECTBB(i))
 238 :            enddo
 239 :            ZRAY1 = ZNUM1 / ZDEN1
 240 :            VALPP = ZRAY1
 241 :            W2CALC = VALPP                                               
 241 :            CALL W2FREQ(W2CALC,W2SHIF, W2,FREP,LIMAGE)
 242 :          ENDIF
 243 :              
 244 : c        calcul du residu = Kz - lambda*Mz et de sa norme au carré 
 245 :          VALPM = -1.D0*VALPP
 246 :          XNUM1 = 0.D0
 247 :          do i=1,inc
 248 :             XRES1 = mvect4.VECTBB(i) + (VALPM * mvect2.VECTBB(i))
 249 :             XNUM1 = XNUM1 + (XRES1*XRES1)
 250 :          enddo
 251 :          
 252 : c        calcul d une ref |K*z|_2^2 ou |M*z|_2^2
 253 :          XDEN1=0.D0
 254 :          XDEN2=0.D0
 255 :          do i=1,inc
 256 :             XDEN1 = XDEN1 + (mvect4.VECTBB(i)*mvect4.VECTBB(i))
 257 :             XDEN2 = XDEN2 + (mvect2.VECTBB(i)*mvect2.VECTBB(i))
 258 :          enddo         
 259 :          segsup,mvect4
 260 : c          XRES1 = XNUM1 / XDEN1
 261 : c          if(XRES1.gt.1.D-5)  
 262 :          XDEN1m=max(XDEN1,XDEN2)
 263 :          XRES1 = XNUM1 / XDEN1m
 264 :          
 265 :          IF (IIMPI.ge.6) then
 266 :           WRITE(IOIMP,109) IB105,IEME,frep,XRES1,XNUM1,XDEN1,XDEN2
 267 :  109      FORMAT(1X,I5,3X,I5,3X,F12.3,5X,E10.5,
 268 :      &            5X,E10.5,1X,E10.5,1X,E10.5)
 269 :          endif
 270 : *           
 271 : *------- DIFFERENT CAS DE FIGURES ------------------------------------*
 272 : *
 273 : 
 274 : *------- a. on a convergé: le residu relatif < tolerance -------------*
 275 : cbp13.01.2010     if (XRES1.le.1.D-4) then -> pas assez contraignant ?
 276 : cbp25.01.2010     if (XRES1.le.1.D-6) then -> pas suffisant pour K-orthog
 277 : c          if (XRES1.le.1.D-8)  then
 278 :          if (XRES1.le.XPREC21)  then
 279 :            
 280 :                 CONVRG = .true.
 280 : c       call gibtem(xkt31) 
 281 : c       WRITE(IOIMP,*) '=> simul3 CONVRG xkt31=',xkt31
 282 :                 
 283 :                 
 284 : *------- b. le residu relatif > tolerance  ---------------------------*
 285 : *           et on avait convergé en lambda
 286 : c           =>  on essaie de converger en residu = "Purge"
 287 : c          elseif((IEME.le.nbonve).and.(I101.le.N101)) then
 288 :          elseif(I101.le.N101) then
 289 : c          elseif((I101.le.N101).and.(XRES1.le.XRMAX)) then
 290 :              
 291 : *            -puisque X et MX vont changer ...
 292 :               segsup,mvect1,mvect2
 293 :               
 294 : *            -iterations inverses avec z en vecteur initial
 294 :               CALL ITINV (IPKW2M,IPMASS,IPVECP,PROPRE,CONVRG,1,100                
 295 :      &                    ,1.D-5,1.D0,IPMV1)
 296 : * bp: avec des petites matrices (3x3 par ex), ITINV ne peut rien si on 
 297 : * ne shifte pas => il est urgent d'améliorer l'estimation des vp faite
 298 : * par sespa3 dans simu21 (utilisation du QR par ex.)
 299 : c               if(IIMPI.ge.6)
 300 : c      &           WRITE(IOIMP,*) ' simul3: Residu=',XRES1,
 301 : c      &          ' appel',I101,'a itinv cvg?',CONVRG,' vers',(PROPRE(1))
 302 :               if(IERR .NE. 0) RETURN 
 303 :      
 303 :               call chv3(icholi,IPVECP,mvect1,1)
 303 :               call dtchpo(IPVECP)
 304 : 
 305 : *            -M-orthogonalisation % ...
 306 :               I08 = 0
 307 :    08         continue
 308 :               I08 = I08 + 1
 309 :               xtrum = 0.D0    
 310 :               
 311 : c *             ... aux modes des cycles précedents convergés...
 312 : c               if (JG0.gt.1)  then
 313 : c                  if(IIMPI.ge.7)
 314 : c      &           WRITE(IOIMP,*) ' simul3: M-orthog % cycles precedents'           
 315 : c                  do 09 jpo=1,JG0
 316 : c                    FRjpo = mlree1.prog(jpo)
 317 : c                    FRDIST = 1.001D0*(FREP-FRSHIF)
 318 : c                    FRDISj = (FRjpo-FRSHIF)
 319 : c                    FRSIGN = FRDIST*FRDISj
 320 : c *                  ...proches du modes testés!
 321 : c                    if((FRSIGN.lt.0.D0).or.(FRDIST.lt.FRDISj)) goto 09
 322 : c *                  on recupere  z^j  et  r^j = M*z^j / (z^j*M*z^j)
 323 : c                    mvect6= mlent5.lect(jpo)
 324 : c                    mvect7= mlent6.lect(jpo)
 325 : c                    segact mvect6,mvect7
 326 : c *                  on calcule xtru = y^i * r^j
 327 : c                    xtru = 0.D0
 328 : c                    do iou=1,inc
 329 : c                       xtru=xtru+(mvect1.vectbb(iou)*mvect7.vectbb(iou))
 330 : c                    enddo
 331 : c                    xtrum = xtrum + abs(xtru)
 332 : c                    if (abs(xtru).ge.XORTHO) then
 333 : c *                    y^i = y^i - xtru * z^{j}
 334 : c                      do iou=1,inc
 335 : c                        mvect1.vectbb(iou) = mvect1.vectbb(iou) 
 336 : c      $                              - (xtru*mvect6.vectbb(iou))
 337 : c                      enddo 
 338 : c                    endif
 339 : c                    segdes mvect6,mvect7
 340 : c    09            continue
 341 : c               endif
 342 :               
 343 : *             ... aux modes de ce cycle convergés
 344 :               if (IEME.gt.1)  then
 345 :                  if(IIMPI.ge.7)
 346 :      &           WRITE(IOIMP,*) ' simul3: M-orthog % modes de ce cycle'           
 347 :      &                   ,(JG0+1),' a ',(JG0+IEME-1)     
 348 :                  do jpo=(JG0+1),(JG0+IEME-1)
 349 : *                  on recupere  z^j  et  r^j = M*z^j / (z^j*M*z^j)
 350 :                    mvect6= mlent5.lect(jpo)
 351 :                    mvect7= mlent6.lect(jpo)
 352 : cbp inutile car jpo>JG0    segact mvect6,mvect7
 353 : *                  on calcule xtru = y^i * r^j
 354 :                    xtru = 0.D0
 355 :                    do iou=1,inc
 356 :                       xtru=xtru+(mvect1.vectbb(iou)*mvect7.vectbb(iou))
 357 :                    enddo
 358 :                    xtrum = xtrum + abs(xtru)
 359 :                    if (abs(xtru).ge.XORTHO) then
 360 : *                    y^i = y^i - xtru * z^{j}
 361 :                      do iou=1,inc
 362 :                        mvect1.vectbb(iou) = mvect1.vectbb(iou) 
 363 :      $                              - (xtru*mvect6.vectbb(iou))
 364 :                      enddo 
 365 :                    endif
 366 : cbp inutile car jpo>JG0    segdes mvect6,mvect7
 367 :                  enddo
 368 :               endif
 369 :               
 370 : *             a t on besoin de re-orthogonaliser ?
 371 :               if (xtrum.ge.0.707D0)  then
 372 : *               2 re-orthogonalisation c'est suffisant !
 373 :                 if (I08.ge.2) then
 373 :                    call crech2(IPVECP,mvect1,mvecri,1)              
 374 :                    segact,mvect1*mod
 375 :                    CONVRG = .false.              
 376 :                    goto 101
 377 :                 endif
 378 :                 goto 08                 
 379 :               endif
 380 : *            -fin de la M-orthogonalisation
 381 :                
 381 :               call crech2(IPVECP,mvect1,mvecri,1)              
 382 :               segact,mvect1*mod
 383 :   
 384 :               CONVRG = .false.              
 384 : c              call DTCHPO(IPMV1)
 385 :               goto 101
 386 :                
 387 : *------- c. le residu relatif > tolerance  ---------------------------*
 388 : *           et on N'avait PAS convergé en lambda
 389 : c           =>  on S'ARRETE LA 
 390 :          else
 391 :              
 392 :                CONVRG = .false.
 393 :                
 394 :          endif
 395 :              
 396 : *------- Non convergence on fait le menage et on retourne ------------*
 397 :          IF (.NOT.CONVRG) THEN   
 398 :                IEME = IEME - 1
 399 : *             -On detruit vecteurs, chpoints
 400 :                segsup,mvect1,mvect2
 400 :                call DTCHPO(IPVECP)
 400 :                call DTCHPO(IPMV1)
 401 :                goto 905
 402 : c c *              si on a testé plus de NMODIN candidats, on sort         
 403 : c c                if(IB105.ge.NMODIN) goto 905   
 404 : c c c *              si on teste un candidat appartenant aux NMOD 1ers modes, 
 405 : c c c *              on le compte si on l a raté         
 406 : c c c                if((nbonZ+IB105).le.NMOD) NRATE=NRATE+1
 407 : c c                goto 105
 408 : c *              si on a testé plus de NMODIN candidats, on sort         
 409 : c                if(IB105.ge.NMODIN) goto 905
 410 : c                NRATE=NRATE+1
 411 : c *              si on a raté trop de modes, on sors aussi        
 412 : c                if(NRATE.gt.Nramax) goto 905
 413 : c                goto 105
 414 :          ENDIF  
 415 :          
 416 : *------- Convergence : on fait aussi le menage  ----------*
 416 :          call DTCHPO(IPMV1)
 417 : *                                                                      
 418 : *       -CE MODE A T IL DEJA ETE CALCULE ?
 419 :          modif205 = 0
 420 :    09    continue
 421 :          xtrum = 0.D0
 422 :          FRREF = max(FRSHIF,abs(FREP))
 423 :          FRREF = max(FRREF,1.D0)
 424 :          NB205 = JG0 + IEME - 1
 425 :          do 205 jb205=1,NB205
 426 :             FR205 = mlree1.prog(jb205)
 427 :             ECARFR = abs(FREP-FR205)  
 428 :             ECAREL = ECARFR / FRREF
 429 : *           on a trouvé un autre mode a la meme freq => on orthogonalise
 430 : c bp 10/12/2010 : quand les shifts de 2 cycles sont tres differents,
 431 : c                 on peut avoir de plus gros ecart que prévu....
 432 :             if ((ECAREL.lt.1.D-2).or.(ECARFR.lt.1.D0))  then
 433 : *              on recupere  z^j  et  r^j = M*z^j / (z^j*M*z^j)
 434 :                mvect6= mlent5.lect(jb205)
 435 :                mvect7= mlent6.lect(jb205)
 436 :                if(jb205.le.JG0)  segact,mvect6,mvect7
 437 : *              on calcule xtru = y^i * r^j
 438 :                xtru = 0.D0
 439 :                do iou=1,inc
 440 :                   xtru=xtru+(mvect1.vectbb(iou)*mvect7.vectbb(iou))
 441 :                enddo
 442 :                xtrum = xtrum + abs(xtru)
 443 :                if (abs(xtru).ge.XORTHO) then
 444 :                  modif205 = modif205 + 1
 445 :                  if(IIMPI.ge.6) WRITE(IOIMP,*)
 446 :      &           'ORTHOGONALISATION PAR RAPPORT AU MODE',jb205
 447 : *                y^i = y^i - xtru * z^{j} 
 448 :                  do iou=1,inc
 449 :                    mvect1.vectbb(iou) = mvect1.vectbb(iou) 
 450 :      $                          - (xtru*mvect6.vectbb(iou))
 451 :                  enddo 
 452 :                endif
 453 :                if(jb205.le.JG0)  segdes,mvect6,mvect7
 454 :             endif
 455 :   205    continue 
 456 : *        si grosse modif, on reorthogonalise en 2 passes
 457 : *         if(xtrum.ge.0.707) goto 09   aucun sens car z non-normalisé
 457 : c       call gibtem(xkt32) 
 458 : c       WRITE(IOIMP,*) '=> simul3 orthog xkt32=',xkt32,modif205
 459 :          
 460 : *       -si on a modifie le candidat on verifie qu il en reste qq chose 
 461 :          if (modif205.gt.0) then
 462 :            segsup,mvect2
 463 : *          calcul de M.Z       
 463 :            call DTCHPO(IPVECP)
 463 :            call crech2(IPVECP,mvect1,mvecri,1)              
 463 :            call MUCPRI(IPVECP,IPMASS,IPMV1)
 463 :            call chv2(icholi,IPMV1,mvect2,1)
 463 :            call dtchpo(IPMV1)           
 464 :            segact,mvect1,mvect2*mod
 465 : *          calcul de Z^T.M.Z       
 466 :            ZTMZ2 = 0.D0
 467 :            do i=1,inc
 468 :               ZTMZ2 = ZTMZ2 + (mvect2.vectbb(i)*mvect1.vectbb(i))
 469 :            enddo
 470 :          else
 471 :            ZTMZ2 = ZTMZ
 472 :          endif
 473 :          
 474 :          RNM = abs(ZTMZ2 / ZTMZ)
 475 :          if (RNM.lt.RLIM) then
 476 : *           le mode candidat est deja présent dans la solution
 477 : *           (il en reste moins de 1/10000ieme pour xprec21=1E-8)
 478 : *           => on l oublie et on passe au suivant
 479 :             if(IIMPI.GE.6)
 480 :      &      WRITE(IOIMP,*) 'MODE DEJA PRESENT DANS LA SOLUTION',RNM
 481 :             IEME = IEME - 1
 482 :             goto 105
 483 :          endif
 484 :          
 485 : *       -le mode candidat a survecu aux differents tests
 486 : *        => on l'ajoute a la solution
 487 : 
 488 : *       -ON STOCKE  Z  et  M.Z/(Z^T.M.Z)  POUR L ORTHOGONALISATION
 489 :          coe2 = 1.D0 / ZTMZ2
 490 :          do i=1,inc
 491 :            mvect2.vectbb(i) = coe2 * (mvect2.vectbb(i))
 492 :          enddo
 493 : *       -ON STOCKE  FREP,  Z  et  M.Z/(Z^T.M.Z)  POUR L ORTHOGONALISATION
 494 :          mlree1.prog(JG0+IEME) = FREP
 495 :          mlent5.lect(JG0+IEME) = mvect1
 496 :          mlent6.lect(JG0+IEME) = mvect2
 497 :          
 498 : *                                                                      
 499 : *------- CREATION OU COMPLETION DE L'OBJET "SOLUTION" ----------------*                
 500 : * solution du cycle seulement! le reste est dans idist (cf strate.eso)
 500 :          CALL SIMUL6 (FREP,IPVECP,IPSOLU)                              
 501 :          IF (IERR .NE. 0) RETURN 
 502 : 
 503 : *                                                                 
 504 :   105 CONTINUE 
 505 : *     fin de la boucle sur les modes 
 506 : 
 507 :   905 CONTINUE 
 508 : *      
 509 : *---- finalement on trouvé nbonve modes de residu < XPREC21 ----------*
 510 :       nbonve = IEME
 511 :       JG = JG0 + nbonve
 512 :       segadj,mlent5
 513 :       segadj,mlent6      
 514 :       segadj,mlree1
 515 :       IF (IIMPI.EQ.7) then
 516 :         WRITE(IOIMP,*) 'simul3: finalement '
 517 :         WRITE(IOIMP,*) ' Modes OK pour ce cycle, au total',nbonve,JG
 518 :       ENDIF
 519 :       
 520 : c     on desactive les vecteurs de ce cycle
 521 :       if (IEME.ge.1) then    
 522 :       do j=(JG0+1),JG
 523 :          mvect1=mlent5.lect(j)
 524 :          mvect2=mlent6.lect(j)
 525 :          segdes,mvect1,mvect2
 526 :       enddo
 527 :       endif
 528 :          
 529 :       segdes,mlent5,mlent6
 530 :       segdes,mlree1
 531 :       
 532 : *      
 533 : *----- MENAGE  --------------------------------------*                                      
 534 : *                                                                      
 535 :       SEGSUP,MLREEL,MLENTI,IPHI
 536 : *      
 537 : *      
 538 :       END                                                              
 539 :  
 540 :  
 541 :  
 542 :  
 543 :  
 544 :  
 545 :  
 546 :  
 547 :  
 548 :  
 549 :  

© Cast3M 2003 - All rights reserved.
Disclaimer