36
37
38
39#include "implicit_f.inc"
40
41
42
43 INTEGER NDDL ,NNZ ,IADK(*) ,JDIK(*),NNZM ,IADM(*),JDIM(*),
44 . NNE,ISKY(*),MAX_L
45
47 . diag_k(*), diag_m(*), lt_k(*) ,lt_m(*) ,psi ,li(*)
48
49
50
51 INTEGER I,J,K,REJ,MAXK,
52 1 K0 ,J0 ,K1, KFT,LSKY
54 . aii,ajj,lkik,s, fac
55
56
57 rej = 0
58 maxk = 0
59 nne = 0
60 nnzm = 0
61 iadm(1)=1
62 DO i=1,nddl
63 diag_m(i) = diag_k(i)
64 isky(i)=i
65 li(i)=zero
66 ENDDO
67
68 DO i=1,nddl
69 aii = diag_m(i)
70 k0 = iadk(i+1) - 1
71 IF (k0>0) THEN
72 j0 = jdik(k0)
73 IF (j0>maxk) maxk=j0
74 ENDIF
75 DO j = iadk(i),k0
76 k1= jdik(j)
77 li(k1) = lt_k(j)
78
79 IF (isky(k1)==k1) isky(k1)=i
80 ENDDO
81 kft =isky(i)
82 DO k = kft,i-1
83 lsky = isky(k)
84
85 IF (lsky<iadm(k+1).AND.jdim(lsky)==i) THEN
86 lkik = lt_m(lsky)/diag_m(k)
87 aii = aii -lt_m(lsky)*lkik
88 isky(k)=lsky+1
89 DO j = isky(k),iadm(k+1)-1
90 k1= jdim(j)
91
92 li(k1) = li(k1)-lkik*lt_m(j)
93 ENDDO
94 ENDIF
95 ENDDO
96 DO 100 j = i+1 , maxk
97 IF (isky(j)==j) GOTO 100
98 s = li(j)
99 IF (s/=zero) THEN
100 li(j)=zero
101 ajj = diag_m(j)
102 IF (psi==zero) THEN
103 nnzm = nnzm +1
104 IF (nnzm>max_l)
CALL err_mem(nnzm)
105 lt_m(nnzm)=s
106 jdim(nnzm)=j
107 ELSEIF (s*s<psi*aii*ajj) THEN
108 s =abs(s)
109 fac = sqrt(aii/ajj)
110 aii = aii +s*fac
111 diag_m(j) = ajj +s/fac
112 rej = rej +1
113 ELSE
114 nnzm = nnzm +1
115 IF (nnzm>max_l)
CALL err_mem(nnzm)
116 lt_m(nnzm)=s
117 jdim(nnzm)=j
118 ENDIF
119 ENDIF
120 100 CONTINUE
121 IF (aii<em20) THEN
122 nne=nne+1
123 aii=sign(
max(abs(aii),em20),aii)
124 ENDIF
125 diag_m(i) = one/aii
126 iadm(i+1)=nnzm+1
127 DO j = iadm(i),nnzm
128 lt_m(j)=lt_m(j)*diag_m(i)
129 ENDDO
130 isky(i)=iadm(i)
131 IF (isky(i)>nnzm) isky(i)= iadm(i)
132 ENDDO
133
134
135
136
137
138
139
140
141
142 RETURN