[updated 26.Aug.2000]
Librairie cesse > Fichier cdmodc.f |
SUBROUTINE CDMODC (NBNELI,NGNELI,NBNECO,NGNECO,NULAPL,IPLAGE
& ,TYMATR,MCMATR,TYSCMB,MCSCMB,NBNEES,NGNEES
& ,TYESSE,MCESSE,RST,CST)
Auteur : D.Martin & O.DeBayser (Avril 1989)
Derniere modification : D.Martin (4 Juillet 1997)
Version 1.0.0
Modification d'un terme matrice 'MORSE' par annulation des colonnes
de noeuds Dirichlet sur les lignes de noeuds non Dirichlet
et, dans le cas d'une condition essentielle non homogene, d'un terme
vecteur second-membre par report de l'elimination.
-- Arguments --
NBNELI Nombre de noeuds en ligne du terme
NGNELI Numerotation globale en ligne du terme,
NBNECO Nombre de noeuds en colonne du terme
NGNECO Numerotation globale en colonne du terme,
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 matriciel
TYSCMB Type du second membre eventuel
MCSCMB Adresse en M.C. du second membre eventuel
NBNEES Nombre de noeuds 'Dirichlet'
NGNEES Numeros de noeuds des noeuds 'Dirichlet'
TYESSE Type de la donnee de Dirichlet
MCESSE Adresse en M.C. de cette donnee
RST,CST Super-tableau numerique, version reelle et complexe
CHARACTER*(*) TYMATR,TYSCMB,TYESSE
INTEGER NBNELI,NGNELI(*),NBNECO,NGNECO(*),NULAPL(*)
& ,IPLAGE(2,*),MCMATR,MCSCMB,NBNEES,NGNEES(*),MCESSE
REAL RST(*)
COMPLEX CST(*)
INTEGER NUPRPL,NUDRPL,NUMPLA,LGCUAV,LGCUAP,LGCUAW
& ,NULINE,IDIRLI,NXNEDI,NXCODI,KOLDEB,KOLFIN,IADRES
& ,LIGNEI,KOLONJ,KOLDIR,MCSCM1
CALL PRFXMJ (1,'*CdMoDc*')
NUPRPL=1
LGCUAV=0
NXNEDI=1
MCSCM1=MCSCMB-1
DO 100 LIGNEI=1,NBNELI
MCSCM1=MCSCM1+1
NULINE=NGNELI(LIGNEI)
NUDRPL=NULAPL(LIGNEI)
LGCUAP=IPLAGE(2,NUDRPL)
LGCUAW=LGCUAV
LGCUAV=LGCUAP
Recherche des lignes de la matrice ne correspondant pas a un
noeud portant la condition essentielle
CALL DICOTO (NXNEDI,NBNEES,NGNEES,NULINE,IDIRLI,*1) !utilite
NXNEDI=IDIRLI+1
GOTO 100
1 NXCODI=1
IF (TYMATR(1:1).EQ.'R') THEN
DO 12 NUMPLA=NUPRPL,NUDRPL
KOLDEB=IPLAGE(1,NUMPLA)
LGCUAP=IPLAGE(2,NUMPLA)
KOLFIN=KOLDEB-1+LGCUAP-LGCUAV
IF (NGNECO(KOLFIN).LT.NGNEES(NXCODI)) GOTO 12
IADRES=MCMATR+LGCUAV
DO 11 KOLONJ=KOLDEB,KOLFIN
Colonnes correspondant a des D.L. Dirichlet
CALL DICOTO (NXCODI,NBNEES,NGNEES,NGNECO(KOLONJ) !utilite
& ,KOLDIR,*11)
NXCODI=KOLDIR+1
Report de -Aij x Uj dans le second membre
IF (MCESSE.GT.0) CALL CDSCND (1,TYMATR,IADRES !cdesse
& ,TYSCMB,MCSCM1,TYESSE,MCESSE-1+KOLDIR,RST,CST)
Mise a zero du coefficient Aij
RST(IADRES)=0.
11 IADRES=IADRES+1
IF (NXCODI.GT.NBNEES) GOTO 100
12 LGCUAW=LGCUAP
ELSEIF (TYMATR(1:1).EQ.'C') THEN
DO 22 NUMPLA=NUPRPL,NUDRPL
KOLDEB=IPLAGE(1,NUMPLA)
LGCUAP=IPLAGE(2,NUMPLA)
KOLFIN=KOLDEB-1+LGCUAP-LGCUAV
IF (NGNECO(KOLFIN).LT.NGNEES(NXCODI)) GOTO 22
IADRES=MCMATR+LGCUAV
DO 21 KOLONJ=KOLDEB,KOLFIN
CALL DICOTO (NXCODI,NBNEES,NGNEES,NGNECO(KOLONJ) !utilite
& ,KOLDIR,*21)
NXCODI=KOLDIR+1
IF (MCESSE.GT.0) CALL CDSCND (1,TYMATR,IADRES !cdesse
& ,TYSCMB,MCSCM1,TYESSE,MCESSE-1+KOLDIR,RST,CST)
CST(IADRES)=0.
21 IADRES=IADRES+1
IF (NXCODI.GT.NBNEES) GOTO 100
22 LGCUAW=LGCUAP
ENDIF
100 NUPRPL=NUDRPL+1
CALL PRFXMJ (-1,'*CdMoDc*')
END !CdMoDc
cdmodc est appelé dans