44 SUBROUTINE sms_check(TIMERS,NODFT ,NODLT ,IADK ,JDIK ,DIAG_K ,
45 2 LT_K ,IADI , JDII ,LT_I ,ITASK ,
46 3 ITAB ,IAD_ELEM,FR_ELEM,FR_SMS,FR_RMS,
47 4 LIST_SMS,LIST_RMS,AMS_WORK)
58#include
"implicit_f.inc"
66#include "timeri_c.inc"
71 TYPE(timer_),
INTENT(INOUT) :: TIMERS
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(*)
79 . diag_k(*), lt_k(*), lt_i(*)
81 TYPE(ams_work_),
INTENT(INOUT) :: AMS_WORK
87 INTEGER I, J, K, L, NOD, IBID, IERR, IMIN,
95 IF(ispmd==0.AND.itask==0)
THEN
102 p_mach_sms = two*sqrt(flmin)
109 ams_work%check%NNZM = nnz_sms
111 IF (imon>0.AND.itask==0)
CALL startime(timers,32)
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)
123 ams_work%check%NNDFT0=0
124 ams_work%check%NNDFT1=numnod
129 ams_work%check%ISORTND(nod)=nod
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)
141 nod = ams_work%check%ISORTND(k)
142 ams_work%CHECK%INVND(nod) = k
146 ams_work%check%KADM(nod)=iadk(nod+1)-iadk(nod)
155 1 fr_sms ,fr_rms,list_sms,list_rms,iad_elem,
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)
166 ams_work%CHECK%IADM(1)=1
168 ams_work%CHECK%IADM(i+1)=ams_work%CHECK%IADM(i)+ams_work%CHECK%KADM(ams_work%CHECK%ISORTND(i))
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
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))
188 ams_work%CHECK%JDIM(l)=k
189 ams_work%CHECK%LT_M(l)=lt_k(j)
193 ams_work%CHECK%KADM(i)=l
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
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)
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)
220 DO k=ams_work%CHECK%IADM(i),ams_work%CHECK%IADM(i+1)-1
221 j = ams_work%CHECK%JDIM(k)
224 ams_work%CHECK%KADM(i) = ams_work%CHECK%KADM(i) + 1
234 ams_work%CHECK%JADM(1)=1
236 ams_work%CHECK%JADM(i+1)=ams_work%CHECK%JADM(i)+ams_work%CHECK%KADM(i)
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)
248 DO k=ams_work%CHECK%IADM(i),ams_work%CHECK%IADM
249 j = ams_work%CHECK%JDIM(k)
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
257 ams_work%CHECK%LT_M2(itag(j)) = ams_work%CHECK%LT_M2(itag(j)) + ams_work%CHECK%LT_M(k)
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)
273 DO i=1,ams_work%CHECK%NNDFT0
274 ams_work%CHECK%DIAG_INV(i) = zero
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))
288 IF(ispmd==0.AND.itask==0)
THEN
290 WRITE(istdo,3001) imin,lmin
291 WRITE(iout,3001) imin,lmin
299 IF (imon>0.AND.itask==0)
CALL stoptime(timers,32)
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)
317 2001
FORMAT(
' ... RUNNING DIAGNOSIS')
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')
343 1 NNDFT0 ,NNDFT1,ITASK ,DIAG_INV)
351#include "implicit_f.inc"
352#include "comlock.inc"
356#include "com04_c.inc"
360 INTEGER NNZM , IADM(*), JDIM(*),
361 . NNDFT0 ,NNDFT1,ITASK
364 . diag_m(*), lt_m(*), diag_inv(*)
369 INTEGER I,J,K,M,N,NC,MAX_L,IERR,I_CHK,IER1,
371 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IADA, JDIA
373 .
DIMENSION(:),
ALLOCATABLE :: diag_a, lt_a, mj
375 IF ((nndft0+1)>numnod)
RETURN
377 ALLOCATE(iada(numnod+1),diag_a(numnod),mj(numnod),stat=ier1)
378 ALLOCATE(lt_a(nnzm),jdia(nnzm),stat=ierr)
380 IF ((ierr+ier1)/=0)
THEN
381 CALL ancmsg(msgid=19,anmode=aninfo,
391 IF(diag_m(i)==zero)
THEN
396 CALL sp_stat0(i ,iadm ,jdim ,nc ,jm )
398 . iada ,jdia ,diag_a ,lt_a ,jm ,
411 max_l=1+(nc*(nc-1))/2
412 CALL imp_fsai(nc ,iada ,jdia ,diag_a ,lt_a ,
422 DEALLOCATE(iada,diag_a,mj)
423 DEALLOCATE(lt_a,jdia)
493 1 NDDL ,IADK ,JDIK ,DIAG_K ,LT_K ,
498#include "implicit_f.inc"
505 INTEGER NDDL ,IADK(*) ,JDIK(*)
508 . DIAG_K(*), LT_K(*) , R(*)
512 INTEGER I,J,IT,IP,NLIM,ND,ISTOP,ISP,IBID
514 . s , r2, r02,
alpha, beta, g0, g1, rr, tols, toln, tols2
516 . x(nddl) ,p(nddl) ,z(nddl) ,y(nddl),diag_m(nddl)
522 tols=sqrt(p_mach_sms)
530 diag_m(i)=one/
max(em20,diag_k(i))
533 1 nddl ,ibid ,iadk ,jdik ,diag_k,
539 z(i) = r(i) *diag_m(i)
546 1 nddl ,ibid ,iadk ,jdik ,diag_k,
554 IF (r02==zero)
GOTO 200
559 x(i) = x(i) +
alpha*p(i)
560 r(i) = r(i) -
alpha*y(i)
563 z(i) = r(i) *diag_m(i)
573 ELSEIF (r2<=toln)
THEN
581 p(i) = z(i) + beta*p(i)
584 1 nddl ,ibid ,iadk ,jdik ,diag_k,
589 x(i) = x(i) +
alpha*p(i)
590 r(i) = r(i) -
alpha*y(i)
593 z(i) = r(i) *diag_m(i)
602 ELSEIF (r2<=toln)
THEN
623 1002
FORMAT(3x,
'TOTAL C.G. ITERATION=',i8
624 .
' RELATIVE RESIDUAL NORM=',e11.4)
626 .
'---WARNING : THE ITERATION LIMIT NUMBER WAS REACHED',
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)