1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| C **********************************************************************
C
Subroutine L101(A,LDA,NLA,Kerr)
C
C **********************************************************************
C
C Système linéaire
C Factorisation
C
C Matrice générale
C Stockage dans un tableau à 2 indices
C
C Jean-Marc Blanc, janvier 2005
C **********************************************************************
C
C A l'entrée:
C
C A Matrice à factoriser
C
C LDA Nombre de lignes du tableau A tel que déclaré dans le
C programme appelant.
C
C NLA Taille effective de la matrice.
C
C
C A la sortie:
C
C A Matrices triangulaires résultant de la factorisation,
C l'une triangulaire inférieure (termes diagonaux égaux
C à 1) et l'autre triangulaire supérieure.
C
C Kerr Paramètre d'erreur: Kerr vaut 0 si la factorisation
C s'est déroulée normalement. Dans le cas contraire, sa
C valeur indique quel pivot a été trouvé nul.
C
C Pour résoudre un système linéaire dont la matrice est stockée
C dans le tableau A et les colonnes de seconds membres dans le
C tableau V, on utilisera successivement les sous-programmes
C L001, L102 et L004:
C
C Call L101(A,LDA,NLA,Kerr)
C If (Kerr.Gt.0) Stop
C Call L002(A,LDA,V,LDV,NLA,NCV)
C Call L004(A,LDA,V,LDV,NLA,NCV,Kerr)
C
C **********************************************************************
C
Implicit None
C
Integer LDA,NLA,KErr
Real*8 A(LDA,1)
C
Integer IL,IC,II
Real*8 S
C
C **********************************************************************
C
Kerr=0
If (A(1,1).Eq.0.d0) Then
Write (*,'(1X,A)') 'L101: Pivot 1 nul'
Kerr=1
Return
End If
C
Do IL=2,NLA
A(IL,1)=A(IL,1)/A(1,1)
End Do
C
Do IC=2,NLA
Do II=IC,NLA
S=0.d0
Do IL=1,IC-1
S=S+A(IL,II)*A(IC,IL)
End Do
A(IC,II)=A(IC,II)-S
End Do
C
If (IC.Lt.NLA) Then
If (A(IC,IC).Eq.0.d0) Then
Write (*,'(1X,A,I3,A)') 'L101: Pivot ',IC,' nul'
Kerr=IC
Return
End If
Do IL=IC+1,NLA
S=0.d0
Do II=1,IC-1
S=S+A(IL,II)*A(II,IC)
End Do
A(IL,IC)=(A(IL,IC)-S)/A(IC,IC)
End Do
End If
End Do
Return
C
End |
Partager