[updated 26.Aug.2000]
Librairie cesse > Fichier cdmovl.f |
SUBROUTINE CDMOVL (NUKAES,NCPNES,IDNUME,NBNELI,NGNELI,NBNECO
& ,NGNECO,NULAPL,IPLAGE,TYMATR,MCMATR,TYSCMB
& ,MCSCMB,NBNEES,NGNEES,TYESSE,MCESSE,RST,CST)
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)
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
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
cdmovl est appelé dans