48
49
50
51 USE timer_mod
53 USE ams_work_mod
54 USE my_alloc_mod
55
56
57
58#include "implicit_f.inc"
59
60
61
62#include "com01_c.inc"
63#include "com04_c.inc"
64#include "sms_c.inc"
65#include "task_c.inc"
66#include "timeri_c.inc"
67#include "units_c.inc"
68
69
70
71 TYPE(TIMER_), INTENT(INOUT) :: TIMERS
72 INTEGER NODFT, NODLT,
73 . IADK(*), JDIK(*), IADI(*), JDII(*),
74 . ITASK, ITAB(*), IAD_ELEM(2,*), FR_ELEM(*),
75 . FR_SMS(NSPMD+1), FR_RMS(NSPMD+1),
76 . LIST_SMS(*), LIST_RMS(*)
77
79 . diag_k(*), lt_k(*), lt_i(*)
80
81 TYPE(AMS_WORK_), INTENT(INOUT) :: AMS_WORK
82
83
84
85 INTEGER ITAG(NUMNOD)
86
87 INTEGER I, J, K, L, NOD, IBID, IERR, IMIN,
88 . NNZMFT, NNZMLT
90 . lmin
92 . cs1(2)
93 REAL FLMIN
94
95 IF(ispmd==0.AND.itask==0)THEN
96 WRITE(istdo,2001)
97 WRITE(iout,2001)
98 END IF
99
100 IF(itask==0)THEN
102 p_mach_sms = two*sqrt(flmin)
104 END IF
105
106
107
108
109 ams_work%check%NNZM = nnz_sms
110
111 IF (imon>0.AND.itask==0)
CALL startime(timers,32)
112
113 IF(itask==0)THEN
114 CALL my_alloc(ams_work%CHECK%IADM,numnod+1)
115 CALL my_alloc(ams_work%CHECK%JADM,numnod+1)
116 CALL my_alloc(ams_work%CHECK%KADM,numnod)
117 CALL my_alloc(ams_work%CHECK%ISORTND,numnod)
118 CALL my_alloc(ams_work%CHECK%INVND,numnod)
119 ENDIF
120
121
122 IF (nspmd==1) THEN
123 ams_work%check%NNDFT0=0
124 ams_work%check%NNDFT1=numnod
125
127
128 DO nod=nodft,nodlt
129 ams_work%check%ISORTND(nod)=nod
130 END DO
131 ELSEIF(itask==0)THEN
133 1 fr_sms ,fr_rms,list_sms,list_rms,iad_elem,
134 2 fr_elem,ams_work%check%NNDFT0,ams_work%check%NNDFT1,
135 * ams_work%check%ISORTND)
136 ENDIF
137
139
140 DO k=nodft,nodlt
141 nod = ams_work%check%ISORTND(k)
142 ams_work%CHECK%INVND(nod) = k
143 END DO
144
145 DO nod=nodft,nodlt
146 ams_work%check%KADM(nod)=iadk(nod+1)-iadk(nod)
147 END DO
148
150
151 IF(itask==0)THEN
152
153 IF (nspmd > 1) THEN
155 1 fr_sms ,fr_rms,list_sms,list_rms,iad_elem,
156 2 fr_elem,ams_work%check%NNZM ,iadk ,ams_work%CHECK%KADM )
157 END IF
158
159 CALL my_alloc(ams_work%CHECK%DIAG_M,numnod)
160 CALL my_alloc(ams_work%CHECK%LT_M,ams_work%CHECK%NNZM)
161 CALL my_alloc(ams_work%CHECK%JDIM,ams_work%CHECK%NNZM)
162 CALL my_alloc(ams_work%CHECK%DIAG_INV,numnod)
163 ENDIF
164
165 IF(itask==0)THEN
166 ams_work%CHECK%IADM(1)=1
167 DO i=1,numnod
168 ams_work%CHECK%IADM(i+1)=ams_work%CHECK%IADM(i)+ams_work%CHECK%KADM(ams_work%CHECK%ISORTND(i))
169 END DO
170 END IF
171
173
174 nnzmft=itask*ams_work%CHECK%NNZM/nthread+1
175 nnzmlt=(itask+1)*ams_work%CHECK%NNZM/nthread
176 ams_work%CHECK%JDIM(nnzmft:nnzmlt)=0
177
179
180
181 DO i=nodft,nodlt
182 nod=ams_work%CHECK%ISORTND(i)
183 ams_work%CHECK%DIAG_M(i) = diag_k(nod)
184 l=ams_work%CHECK%IADM(i)
185 DO j=iadk(nod),iadk(nod+1)-1
186 k=ams_work%CHECK%INVND(jdik(j))
187 IF(k < i) THEN
188 ams_work%CHECK%JDIM(l)=k
189 ams_work%CHECK%LT_M(l)=lt_k(j)
190 l = l + 1
191 END IF
192 ENDDO
193 ams_work%CHECK%KADM(i)=l
194 ENDDO
195
197
198
199 IF (itask == 0 .AND. nspmd > 1) THEN
201 1 fr_sms ,fr_rms,list_sms,list_rms,iad_elem,
202 2 fr_elem,iadk ,jdik ,lt_k ,ams_work%CHECK%KADM ,
203 3 ams_work%CHECK%JDIM ,ams_work%CHECK%LT_M ,ams_work%CHECK%INVND )
204 END IF
205
206
207 IF(itask==0)THEN
208 CALL my_alloc(ams_work%CHECK%LT_M2,ams_work%CHECK%NNZM)
209 CALL my_alloc(ams_work%CHECK%JDIM2,ams_work%CHECK%NNZM)
210 ENDIF
211
213
214 DO i=nodft,nodlt
215 ams_work%CHECK%KADM(i)=0
216 DO k=ams_work%CHECK%IADM(i),ams_work%CHECK%IADM(i+1)-1
217 j = ams_work%CHECK%JDIM(k)
218 IF(j/=0) itag(j) = 0
219 END DO
220 DO k=ams_work%CHECK%IADM(i),ams_work%CHECK%IADM(i+1)-1
221 j = ams_work%CHECK%JDIM(k)
222 IF(j/=0) THEN
223 IF(itag(j)==0)THEN
224 ams_work%CHECK%KADM(i) = ams_work%CHECK%KADM(i) + 1
225 itag(j) = k
226 END IF
227 END IF
228 END DO
229 END DO
230
232
233 IF(itask==0)THEN
234 ams_work%CHECK%JADM(1)=1
235 DO i=1,numnod
236 ams_work%CHECK%JADM(i+1)=ams_work%CHECK%JADM(i)+ams_work%CHECK%KADM(i)
237 END DO
238 END IF
239
241
242 DO i=nodft,nodlt
243 ams_work%CHECK%KADM(i)=ams_work%CHECK%JADM(i)
244 DO k=ams_work%CHECK%IADM(i),ams_work%CHECK%IADM(i+1)-1
245 j = ams_work%CHECK%JDIM(k)
246 IF(j/=0) itag(j) = 0
247 END DO
248 DO k=ams_work%CHECK%IADM(i),ams_work%CHECK%IADM(i+1)-1
249 j = ams_work%CHECK%JDIM(k)
250 IF(j/=0) THEN
251 IF(itag(j)==0)THEN
252 ams_work%CHECK%JDIM2(ams_work%CHECK%KADM(i)) = j
253 ams_work%CHECK%LT_M2(ams_work%CHECK%KADM(i)) = ams_work%CHECK%LT_M(k)
254 itag(j) = ams_work%CHECK%KADM(i)
255 ams_work%CHECK%KADM(i) = ams_work%CHECK%KADM(i) + 1
256 ELSE
257 ams_work%CHECK%LT_M2(itag(j)) = ams_work%CHECK%LT_M2(itag(j)) + ams_work%CHECK%LT_M(k)
258 END IF
259 END IF
260 END DO
261 END DO
262
264
265 CALL sms_fsa_invh(ams_work%CHECK%NNZM ,ams_work%CHECK%JADM ,ams_work%CHECK%JDIM2 ,
266 * ams_work%CHECK%DIAG_M, ams_work%CHECK%LT_M2, ams_work%CHECK%NNDFT0,
267 * ams_work%CHECK%NNDFT1,itask ,ams_work%CHECK%DIAG_INV)
268
270
271 IF (itask == 0) THEN
272
273 DO i=1,ams_work%CHECK%NNDFT0
274 ams_work%CHECK%DIAG_INV(i) = zero
275 ENDDO
276
277 lmin=ep20
278 DO i=ams_work%CHECK%NNDFT0+1,numnod
279 IF(ams_work%CHECK%DIAG_INV(i) < lmin)THEN
280 lmin=ams_work%CHECK%DIAG_INV(i)
281 imin=itab(ams_work%CHECK%ISORTND(i))
282 END IF
283 END DO
284 IF (nspmd > 1) THEN
286 END IF
287
288 IF(ispmd==0.AND.itask==0)THEN
289 IF(lmin<em06)THEN
290 WRITE(istdo,3001) imin,lmin
291 WRITE(iout,3001) imin,lmin
292 ELSE
293 WRITE(istdo,4001)
294 WRITE(iout,4001)
295 END IF
296 END IF
297 END IF
298
299 IF (imon>0.AND.itask==0)
CALL stoptime(timers,32)
300
302
303 IF(itask==0)THEN
304 DEALLOCATE(ams_work%CHECK%IADM)
305 DEALLOCATE(ams_work%CHECK%JADM)
306 DEALLOCATE(ams_work%CHECK%KADM)
307 DEALLOCATE(ams_work%CHECK%ISORTND)
308 DEALLOCATE(ams_work%CHECK%INVND)
309 DEALLOCATE(ams_work%CHECK%DIAG_M)
310 DEALLOCATE(ams_work%CHECK%LT_M)
311 dEALLOCATE(ams_work%CHECK%JDIM)
312 DEALLOCATE(ams_work%CHECK%LT_M2)
313 DEALLOCATE(ams_work%CHECK%JDIM2)
314 DEALLOCATE(ams_work%CHECK%DIAG_INV)
315 END IF
316
317 2001 FORMAT(' ... RUNNING DIAGNOSIS')
318 3001 FORMAT(
319 .' ** WARNING : RADIOSS DETECTED A SEVERE ISSUE',/
320 .' PLEASE CHECK THE MODEL, ESPECIALLY KINEMATIC CONDITIONS',/
321 .' ISSUE MAY OCCUR NEARBY OR ON ENTITY LINKED ',/
322 .' TO NODE ID =',i10/
323 .' (MINIMUM DIAGONAL TERM OF FSAI = ',1pg20.14,')')
324 4001 FORMAT(' ** INFO : COULD NOT IDENTIFY THE ISSUE')
325 RETURN
void floatmin(int *a, int *b, float *flm)
subroutine sms_fsa_invh(nnzm, iadm, jdim, diag_m, lt_m, nndft0, nndft1, itask, diag_inv)
subroutine spmd_nndft_sms(fr_sms, fr_rms, list_sms, list_rms, iad_elem, fr_elem, nndft0, nndft1, isortnd)
subroutine spmd_glob_lmin(lmin, imin)
subroutine spmd_nnz_sms(fr_sms, fr_rms, list_sms, list_rms, iad_elem, fr_elem, nnzm, iadk, kadm)
subroutine spmd_exchm_sms(fr_sms, fr_rms, list_sms, list_rms, iad_elem, fr_elem, iadk, jdik, lt_k, kadm, jdim, lt_m, invnd)
subroutine startime(event, itask)
subroutine stoptime(event, itask)