[updated 26.Aug.2000]

Librairie cesse > Fichier cdmovl.f

Qui appelle cdmovl ?

line
      SUBROUTINE CDMOVL (NUKAES,NCPNES,IDNUME,NBNELI,NGNELI,NBNECO
     &                  ,NGNECO,NULAPL,IPLAGE,TYMATR,MCMATR,TYSCMB
     &                  ,MCSCMB,NBNEES,NGNEES,TYESSE,MCESSE,RST,CST)
line
  Auteurs : D.Martin & O.DeBayser (Avril 1989)
  Derniere modification : O.DeBayser (10 Avril 1996)
  Version 1.0.0
   
  Modification d'un terme matrice 'MORSE' par annulation des coefficients
  non diagonaux des lignes Dirichlet
  et dans le cas d'une condition essentielle non homogene du vecteur
  second-membre par report de Aii*Ui dans la ligne i du second membre 
   
 -- Arguments --
  NUKAES numero de type de condition essebtielle
  NBNESC nombre de noeuds en ligne du second membre
  IDNUME Donnee logique indiquant l'identite des numerotations en ligne
         et colonne du terme sur lequel porte l'elimination
  NBNELI Nombre de noeuds en ligne du terme
  NGNELI Numerotation des noeuds en ligne pour l'interpolation en ligne
  NBNECO Nombre de noeuds en colonne du terme  
  NGNECO Numerotation des noeuds en ligne pour l'interpolation en colonne  
  NULAPL Numeros de derniere plage de chaque ligne 
  IPLAGE Numeros de colonne de debut de plage et longueurs cumulees
  TYMATR Type du terme matriciel
  MCMATR Adresse en M.C. du terme  
  TYSCMB Type du terme second membre
  MCSCMB Adresse en M.C. du second membre  
  NBNEES Nombre de noeuds 'Dirichlet'  
  NGNEES Numerotation des noeuds 'Dirichlet'
  TYESSE Type du tableau de la donnee de Dirichlet 
  MCESSE Adresse en M.C. du second membre  
  RST,CST Super-tableau numerique, version reelle et complexe  
         (n'est necesaire qu'en cas de condition non homogene) 
line
      LOGICAL       IDNUME 
      CHARACTER*(*) TYMATR,TYSCMB,TYESSE 
      INTEGER       NUKAES,NCPNES,NBNELI,NGNELI(*),NBNECO,NGNECO(*)
     &             ,NULAPL(*),IPLAGE(2,*),MCMATR,MCSCMB
     &             ,NBNEES,NGNEES(*),MCESSE
      REAL          RST(*)
      COMPLEX       CST(*)
 
      CHARACTER     AST
      INTEGER       IST
      INTEGER       NUPRPL,NUDRPL,LGCUAV,LGCUAP,LGLIGL
     &             ,NXLIGN,NXCOLO,NUNEDI,LIGNEI,KOLDIA,NUPDIA,MCDIAG
     &             ,IADIAG,IASCMB,IAESSE,IAMATR,J
      REAL          ROFDIA
      COMPLEX       COFDIA
      EQUIVALENCE  (COFDIA,ROFDIA)
      CHARACTER     ERCODE*120
      COMMON/FORMAH/ERCODE
line  
      CALL PRFXMJ (1,'*CdMovl*')
   
      NUPRPL=1 
      LGCUAV=0 
      NXLIGN=1 
      NXCOLO=1 
   
      DO 50 NUNEDI=1,NBNEES
         Recherche des lignes de la matrice correspondant a une relation
         de la condition essentielle
         CALL DICOTO (NXLIGN,NBNELI,NGNELI,NGNEES(NUNEDI),LIGNEI,*50)   !utilite
         NXLIGN=LIGNEI+1
   
         IF (LIGNEI.GT.1) THEN
            NUPRPL=NULAPL(LIGNEI-1)+1  
            LGCUAV=IPLAGE(2,NUPRPL-1)  
         ENDIF
         NUDRPL=NULAPL(LIGNEI) 
         LGCUAP=IPLAGE(2,NUDRPL)
   
         Recherche de la colonne contenant le coeff. diagonal de la matrice
         KOLDIA=LIGNEI 
         COFDIA=0. 
         IF (.NOT.IDNUME) THEN
            CALL DICOTO (NXCOLO,NBNECO,NGNECO,NGNEES(NUNEDI),KOLDIA,*20)!utilite
            NXCOLO=KOLDIA+1
         ENDIF
         Recherche de la plage qui contient le coeff. 'diagonal'
         CALL DIKLPL (KOLDIA,NUPRPL,NUDRPL,LGCUAV,IPLAGE,NUPDIA,*20)    !Morse
  
         Adresse du coeff. diagonal dans la matrice compactee  
         MCDIAG=0  
         IF (NUPDIA.GT.1) MCDIAG=IPLAGE(2,NUPDIA-1)
         MCDIAG=MCDIAG+KOLDIA-IPLAGE(1,NUPDIA)
         MCDIAG=MCMATR+(MCDIAG-1)*NCPNES*NCPNES
         IADIAG=MCDIAG
         IASCMB=MCSCMB+(LIGNEI-1)*NCPNES 
         IAESSE=MCESSE+(NUNEDI-1)*NCPNES
         IAMATR=MCMATR+LGCUAV*NCPNES*NCPNES
         LGLIGL=(LGCUAP-LGCUAV)*NCPNES
   
         On reporte Aii x Ui dans le second membre 
         IF (NUKAES.EQ.1) THEN
            Condition de type u=0, toutes les composantes disparaissent
            DO 7 J=1,NCPNES
               IF (MCESSE.GT.0) THEN
                  CALL CDSCDI (TYMATR,IADIAG,TYSCMB,IASCMB-1+J
     &                        ,TYESSE,IAESSE-1+J,RST,CST)               !cdesse
               ELSEIF (TYSCMB(1:1).EQ.'R') THEN
                  RST(IASCMB-1+J)=0.
               ELSE
                  CST(IASCMB-1+J)=0.
               ENDIF
               CALL TDANST (1,TYMATR,IADIAG,IST,RST   ,CST
     &                       ,TYMATR,  1   ,IST,ROFDIA,COFDIA)          !utilite
               Mise a zero de la ligne excepte pour le coefficient diagonal  
               CALL TAZERO (LGLIGL,TYMATR,IAMATR,AST,IST,RST,CST)       !utilite
               CALL TDANST (1,TYMATR,  1   ,IST,ROFDIA,COFDIA
     &                       ,TYMATR,IADIAG,IST,RST   ,CST   )          !utilite
               IAMATR=IAMATR+LGLIGL
7              IADIAG=IADIAG+LGLIGL+1
         ELSEIF (NUKAES.EQ.2) THEN
            Condition de type u.n=0 la composante normale disparait
            IF (MCESSE.GT.0) THEN
               CALL CDSCDI (TYMATR,IADIAG,TYSCMB,IASCMB-1+J
     &                     ,TYESSE,IAESSE-1+J,RST,CST)                  !cdesse
            ELSEIF (TYSCMB(1:1).EQ.'R') THEN
               RST(IASCMB-1+J)=0.
            ELSE
               CST(IASCMB-1+J)=0.
            ENDIF
            CALL TDANST (1,TYMATR,IADIAG,IST,RST   ,CST
     &                    ,TYMATR,  1   ,IST,ROFDIA,COFDIA)             !utilite
            Mise a zero de la ligne excepte pour le coefficient diagonal  
            CALL TAZERO (LGLIGL,TYMATR,IAMATR,AST,IST,RST,CST)          !utilite
            CALL TDANST (1,TYMATR,  1   ,IST,ROFDIA,COFDIA
     &                    ,TYMATR,IADIAG,IST,RST   ,CST   )             !utilite
         ELSEIF (NUKAES.EQ.3) THEN
            Condition de type u^n=0 les composantes tangentielles
            disparaissent.
            IAMATR=IAMATR+LGLIGL
            IADIAG=IADIAG+LGLIGL+1
            DO 9 J=2,NCPNES
               IF (MCESSE.GT.0) THEN
                  CALL CDSCDI (TYMATR,IADIAG,TYSCMB,IASCMB-1+J
     &                        ,TYESSE,IAESSE-1+J,RST,CST)               !cdesse
               ELSEIF (TYSCMB(1:1).EQ.'R') THEN
                  RST(IASCMB-1+J)=0.
               ELSE
                  CST(IASCMB-1+J)=0.
               ENDIF
               CALL TDANST (1,TYMATR,IADIAG,IST,RST   ,CST
     &                       ,TYMATR,  1   ,IST,ROFDIA,COFDIA)          !utilite
               Mise a zero de la ligne excepte pour le coefficient diagonal  
               CALL TAZERO (LGLIGL,TYMATR,IAMATR,AST,IST,RST,CST)       !utilite
               CALL TDANST (1,TYMATR,  1   ,IST,ROFDIA,COFDIA
     &                      ,TYMATR,IADIAG,IST,RST   ,CST   )           !utilite
               IAMATR=IAMATR+LGLIGL
9              IADIAG=IADIAG+LGLIGL+1
         ELSE
            CALL ENCLER (NUKAES,ERCODE(:4))
            CALL BAISE  (ERCODE(:4)
     &                  //': numero de condition essentielle inconnue') !utilite
         ENDIF
         GOTO 50
  
         Pas de coeff. diagonal dans la matrice compactee,
         toute la ligne est mise a zero d'un coup.  
20       IAMATR=MCMATR+LGCUAV*NCPNES*NCPNES
         LGLIGL=(LGCUAP-LGCUAV)*NCPNES
   
         IF (NUKAES.EQ.1) THEN
            Condition de type u=0, toutes les composantes disparaissent
            Mise a zero de la ligne
            CALL TAZERO (NCPNES*LGLIGL,TYMATR,IAMATR,AST,IST,RST,CST)   !utilite
         ELSEIF (NUKAES.EQ.2) THEN
            Condition de type u.n=0 la composante normale disparait
            Mise a zero de la ligne
            CALL TAZERO (LGLIGL,TYMATR,IAMATR,AST,IST,RST,CST)          !utilite
         ELSEIF (NUKAES.EQ.3) THEN
            Condition de type u^n=0 les composantes tangentielles
            disparaissent.
            IAMATR=IAMATR+LGLIGL
            Mise a zero de la ligne
            CALL TAZERO ((NCPNES-1)*LGLIGL,TYMATR,IAMATR
     &                  ,AST,IST,RST,CST)                               !utilite
         ELSE
            CALL BAISE  ('vous etes tombe dans un trou')                !utilite
         ENDIF
50    CONTINUE 
      CALL PRFXMJ (-1,'*CdMovl*')  
                                                                    END !CdMovl
line
top

cdmovl est appelé dans

top