OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
sms_fsa_inv.F
Go to the documentation of this file.
1Copyright> OpenRadioss
2Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3Copyright>
4Copyright> This program is free software: you can redistribute it and/or modify
5Copyright> it under the terms of the GNU Affero General Public License as published by
6Copyright> the Free Software Foundation, either version 3 of the License, or
7Copyright> (at your option) any later version.
8Copyright>
9Copyright> This program is distributed in the hope that it will be useful,
10Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12Copyright> GNU Affero General Public License for more details.
13Copyright>
14Copyright> You should have received a copy of the GNU Affero General Public License
15Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16Copyright>
17Copyright>
18Copyright> Commercial Alternative: Altair Radioss Software
19Copyright>
20Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21Copyright> software under a commercial license. Contact Altair to discuss further if the
22Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23!||====================================================================
24!|| sms_check ../engine/source/ams/sms_fsa_inv.F
25!||--- called by ------------------------------------------------------
26!|| sms_pcg ../engine/source/ams/sms_pcg.F
27!||--- calls -----------------------------------------------------
28!|| floatmin ../common_source/tools/math/precision.c
29!|| my_barrier ../engine/source/system/machine.F
30!|| sms_fsa_invh ../engine/source/ams/sms_fsa_inv.F
31!|| spmd_exchm_sms ../engine/source/mpi/ams/spmd_sms.F
32!|| spmd_glob_lmin ../engine/source/mpi/ams/spmd_sms.F
33!|| spmd_max_s ../engine/source/mpi/implicit/imp_spmd.F
34!|| spmd_nndft_sms ../engine/source/mpi/ams/spmd_sms.F
35!|| spmd_nnz_sms ../engine/source/mpi/ams/spmd_sms.F
36!|| startime ../engine/source/system/timer_mod.F90
37!|| stoptime ../engine/source/system/timer_mod.F90
38!||--- uses -----------------------------------------------------
39!|| ams_work_mod ../engine/source/modules/ams_work_mod.F90
40!|| message_mod ../engine/share/message_module/message_mod.F
41!|| my_alloc_mod ../common_source/tools/memory/my_alloc.F90
42!|| timer_mod ../engine/source/system/timer_mod.F90
43!||====================================================================
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)
48C-----------------------------------------------
49C M o d u l e s
50C-----------------------------------------------
51 USE timer_mod
52 USE message_mod
53 USE ams_work_mod
54 USE my_alloc_mod
55C-----------------------------------------------
56C I m p l i c i t T y p e s
57C-----------------------------------------------
58#include "implicit_f.inc"
59C-----------------------------------------------
60C C o m m o n B l o c k s
61C-----------------------------------------------
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"
68C-----------------------------------------------
69C D u m m y A r g u m e n t s
70C-----------------------------------------------
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(*)
77C REAL
79 . diag_k(*), lt_k(*), lt_i(*)
80
81 TYPE(ams_work_), INTENT(INOUT) :: AMS_WORK
82C-----------------------------------------------
83C L o c a l V a r i a b l e s
84C-----------------------------------------------
85 INTEGER ITAG(NUMNOD)
86C
87 INTEGER I, J, K, L, NOD, IBID, IERR, IMIN,
88 . nnzmft, nnzmlt
90 . lmin
92 . cs1(2)
93 REAL FLMIN
94C-----------------------------------------------
95 IF(ispmd==0.AND.itask==0)THEN
96 WRITE(istdo,2001)
97 WRITE(iout,2001)
98 END IF
99C machine precision minimum -simple
100 IF(itask==0)THEN
101 CALL floatmin(cs1(1),cs1(2),flmin)
102 p_mach_sms = two*sqrt(flmin)
103 IF (nspmd > 1)CALL spmd_max_s(p_mach_sms)
104 END IF
105C-----------------------------------------------
106C [K]:matrice de masse complete
107C [M]:factorized sparse approximated inverse Lt D L
108C------------------------------------------
109 ams_work%check%NNZM = nnz_sms
110C
111 IF (imon>0.AND.itask==0) CALL startime(timers,32)
112C
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
120C ----- approx. (by each colonne of L_T) inverse ---------
121C ----- utilise d'abord la place de [M] pour la matrice assemblee ---------
122 IF (nspmd==1) THEN
123 ams_work%check%NNDFT0=0
124 ams_work%check%NNDFT1=numnod
125C----------------------
126 CALL my_barrier
127C---------------------
128 DO nod=nodft,nodlt
129 ams_work%check%ISORTND(nod)=nod
130 END DO
131 ELSEIF(itask==0)THEN
132 CALL spmd_nndft_sms(
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
137C----------------------
138 CALL my_barrier
139C---------------------
140 DO k=nodft,nodlt
141 nod = ams_work%check%ISORTND(k)
142 ams_work%CHECK%INVND(nod) = k
143 END DO
144C-----
145 DO nod=nodft,nodlt
146 ams_work%check%KADM(nod)=iadk(nod+1)-iadk(nod)
147 END DO
148C----------------------
149 CALL my_barrier
150C---------------------
151 IF(itask==0)THEN
152C
153 IF (nspmd > 1) THEN
154 CALL spmd_nnz_sms(
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
158C
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
164C---------------------
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
171C----------------------
172 CALL my_barrier
173C---------------------
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
177C----------------------
178 CALL my_barrier
179C---------------------
180C M triee 1 ... NNDFT0 ... NNDFT1 ... NUMNOD
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
195C----------------------
196 CALL my_barrier
197C---------------------
198C M <- termes des processeurs voisins
199 IF (itask == 0 .AND. nspmd > 1) THEN
200 CALL spmd_exchm_sms(
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
205C----------------------
206C M compactage
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
211C----------------------
212 CALL my_barrier
213C---------------------
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
230C----------------------
231 CALL my_barrier
232C---------------------
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
239C----------------------
240 CALL my_barrier
241C---------------------
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
262C----------------------
263 CALL my_barrier
264C---------------------
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)
268C----------------------
269 CALL my_barrier
270C---------------------
271 IF (itask == 0) THEN
272C-------
273 DO i=1,ams_work%CHECK%NNDFT0
274 ams_work%CHECK%DIAG_INV(i) = zero
275 ENDDO
276C-------
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
285 CALL spmd_glob_lmin(lmin,imin)
286 END IF
287C-------
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
298C
299 IF (imon>0.AND.itask==0) CALL stoptime(timers,32)
300C----------------------
301 CALL my_barrier
302C---------------------
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
316C--------------------------------------------
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
326 END
327C--------factorized sparse approximate inverse version hybrid-------
328!||====================================================================
329!|| sms_fsa_invh ../engine/source/ams/sms_fsa_inv.F
330!||--- called by ------------------------------------------------------
331!|| sms_check ../engine/source/ams/sms_fsa_inv.F
332!||--- calls -----------------------------------------------------
333!|| ancmsg ../engine/source/output/message/message.F
334!|| arret ../engine/source/system/arret.F
335!|| get_subsp_sms ../engine/source/ams/sms_fsa_inv.F
336!|| imp_fsai ../engine/source/implicit/imp_fsa_inv.f
337!|| sms_pcg1 ../engine/source/ams/sms_fsa_inv.F
338!|| sp_stat0 ../engine/source/implicit/imp_fsa_inv.F
339!||--- uses -----------------------------------------------------
340!|| message_mod ../engine/share/message_module/message_mod.F
341!||====================================================================
342 SUBROUTINE sms_fsa_invh(NNZM ,IADM ,JDIM , DIAG_M, LT_M,
343 1 NNDFT0 ,NNDFT1,ITASK ,DIAG_INV)
344C-----------------------------------------------
345C M o d u l e s
346C-----------------------------------------------
347 USE message_mod
348C-----------------------------------------------
349C I m p l i c i t T y p e s
350C-----------------------------------------------
351#include "implicit_f.inc"
352#include "comlock.inc"
353C-----------------------------------------------
354C C o m m o n B l o c k s
355C-----------------------------------------------
356#include "com04_c.inc"
357C-----------------------------------------------
358C D u m m y A r g u m e n t s
359C-----------------------------------------------
360 INTEGER NNZM , IADM(*), JDIM(*),
361 . NNDFT0 ,NNDFT1,ITASK
362C REAL
363 my_real
364 . diag_m(*), lt_m(*), diag_inv(*)
365C-----------------------------------------------
366C L o c a l V a r i a b l e s
367C-----------------------------------------------
368C--- M->A^-1 LT_M strictly lower in m.c.r.s. format
369 INTEGER I,J,K,M,N,NC,MAX_L,IERR,I_CHK,IER1,
370 . JM(NUMNOD+1)
371 INTEGER, DIMENSION(:),ALLOCATABLE :: IADA, JDIA
372 my_real,
373 . DIMENSION(:),ALLOCATABLE :: diag_a, lt_a, mj
374C-----------------------------
375 IF ((nndft0+1)>numnod) RETURN
376C
377 ALLOCATE(iada(numnod+1),diag_a(numnod),mj(numnod),stat=ier1)
378 ALLOCATE(lt_a(nnzm),jdia(nnzm),stat=ierr)
379
380 IF ((ierr+ier1)/=0) THEN
381 CALL ancmsg(msgid=19,anmode=aninfo,
382 . c1='FOR FSAI')
383 CALL arret(2)
384 ENDIF
385C
386C Boucle parallele dynamique SMP
387C
388!$OMP DO SCHEDULE(DYNAMIC,1)
389 DO i=nndft0+1,numnod
390
391 IF(diag_m(i)==zero) THEN
392 diag_inv(i)=ep20
393 cycle
394 END IF
395
396 CALL sp_stat0(i ,iadm ,jdim ,nc ,jm )
397 CALL get_subsp_sms(iadm ,jdim ,diag_m ,lt_m ,nc ,
398 . iada ,jdia ,diag_a ,lt_a ,jm ,
399 . nndft0,nndft1)
400 DO j=1,nc-1
401 mj(j)=zero
402 ENDDO
403 mj(nc)=one
404C
405 IF (nc>10000) THEN
406 CALL sms_pcg1(nc ,iada ,jdia ,diag_a ,lt_a ,
407 2 mj ,ierr )
408C
409 ELSE
410C
411 max_l=1+(nc*(nc-1))/2
412 CALL imp_fsai(nc ,iada ,jdia ,diag_a ,lt_a ,
413 . max_l ,mj )
414C
415 ENDIF
416C------------filtrage----Diagonal est dans LT_M (last one)--
417 diag_inv(i)=mj(nc)
418 ENDDO
419
420!$OMP END DO
421C
422 DEALLOCATE(iada,diag_a,mj)
423 DEALLOCATE(lt_a,jdia)
424C
425 RETURN
426 END
427C----------version spmd---set submatrix A(N,N) Format m.c.c.s. for FSAI ----
428!||====================================================================
429!|| get_subsp_sms ../engine/source/ams/sms_fsa_inv.f
430!||--- called by ------------------------------------------------------
431!|| sms_fsa_invh ../engine/source/ams/sms_fsa_inv.F
432!||--- calls -----------------------------------------------------
433!|| ind_lt2ln ../engine/source/implicit/imp_fsa_inv.F
434!|| intab0 ../engine/source/implicit/imp_fsa_inv.F
435!||====================================================================
436 SUBROUTINE get_subsp_sms(IADM ,JDIM ,DIAG_M ,LT_M ,NC ,
437 . IADA ,JDIA ,DIAG_A ,LT_A ,JM ,
438 . NNDFT0,NNDFT1 )
439C-----------------------------------------------
440C I m p l i c i t T y p e s
441C-----------------------------------------------
442#include "implicit_f.inc"
443C-----------------------------------------------
444C D u m m y A r g u m e n t s
445C-----------------------------------------------
446 INTEGER IADM(*), JDIM(*), IADA(*), JDIA(*)
447 INTEGER NC , JM(*), NNDFT0, NNDFT1
448 my_real
449 . LT_A(*),DIAG_A(*),
450 . DIAG_M(*) ,LT_M(*)
451C-----------------------------------------------
452C External function
453C-----------------------------------------------
454 INTEGER INTAB0
455 EXTERNAL INTAB0
456C-----------------------------------------------
457C L o c a l V a r i a b l e s
458C-----------------------------------------------
459 INTEGER I,J,K,JJ,NNZA,N,K0
460C--------------------------------------------
461 nnza=0
462 iada(1)=1
463#include "vectorize.inc"
464 DO i=1,nc
465 j=jm(i)
466C
467 diag_a(i)=diag_m(j)
468 DO k=iadm(j),iadm(j+1)-1
469 jj=jdim(k)
470 n=intab0(nc,jm,jj)
471 IF (n>0) THEN
472 nnza=nnza+1
473 jdia(nnza)=n
474 lt_a(nnza)=lt_m(k)
475 ENDIF
476 ENDDO
477C
478 iada(i+1)=nnza+1
479 ENDDO
480 CALL ind_lt2ln(nc,iada ,jdia ,lt_a, nnza )
481C
482 RETURN
483 END
484!||====================================================================
485!|| sms_pcg1 ../engine/source/ams/sms_fsa_inv.f
486!||--- called by ------------------------------------------------------
487!|| sms_fsa_invh ../engine/source/ams/sms_fsa_inv.F
488!||--- calls -----------------------------------------------------
489!|| mav_lt ../engine/source/implicit/produt_v.f
490!|| produt_v0 ../engine/source/implicit/produt_v.F
491!||====================================================================
492 SUBROUTINE sms_pcg1(
493 1 NDDL ,IADK ,JDIK ,DIAG_K ,LT_K ,
494 2 R ,ISP )
495C-----------------------------------------------
496C I m p l i c i t T y p e s
497C-----------------------------------------------
498#include "implicit_f.inc"
499C-----------------------------------------------
500#include "sms_c.inc"
501C-----------------------------------------------
502C D u m m y A r g u m e n t s
503C-----------------------------------------------
504C----------resol [K]{X}={F}, K stored as diagonal + lt ---------
505 INTEGER NDDL ,IADK(*) ,JDIK(*)
506C REAL
507 my_real
508 . DIAG_K(*), LT_K(*) , R(*)
509C-----------------------------------------------
510C L o c a l V a r i a b l e s
511C-----------------------------------------------
512 INTEGER I,J,IT,IP,NLIM,ND,ISTOP,ISP,IBID
513 my_real
514 . s , r2, r02, alpha, beta, g0, g1, rr, tols, toln, tols2
515 my_real
516 . x(nddl) ,p(nddl) ,z(nddl) ,y(nddl),diag_m(nddl)
517 my_real
518 . eps_m
519C--------------INITIALISATION--------------------------
520 nlim=max(nddl,2)
521
522 tols=sqrt(p_mach_sms)
523 eps_m = p_mach_sms
524
525 it=0
526C-------------IT=0--------
527C------X(I)=ZERO--------
528 DO i=1,nddl
529 x(i) = zero
530 diag_m(i)=one/max(em20,diag_k(i))
531 ENDDO
532 CALL mav_lt(
533 1 nddl ,ibid ,iadk ,jdik ,diag_k,
534 2 lt_k ,x ,z )
535 DO i=1,nddl
536 r(i) = r(i)-z(i)
537 ENDDO
538 DO i=1,nddl
539 z(i) = r(i) *diag_m(i)
540 ENDDO
541 DO i=1,nddl
542 p(i) = z(i)
543 ENDDO
544 CALL produt_v0(nddl,r,z,g0)
545 CALL mav_lt(
546 1 nddl ,ibid ,iadk ,jdik ,diag_k,
547 2 lt_k ,p ,y )
548 CALL produt_v0(nddl,p,y,s)
549 alpha = g0/s
550 tols2=tols*tols
551
552 CALL produt_v0(nddl,r,r,r02)
553 r2 =r02
554 IF (r02==zero) GOTO 200
555 toln=r02*tols2
556C-------pour etre coherent avec lanzos for linear
557 it=1
558 DO i=1,nddl
559 x(i) = x(i) + alpha*p(i)
560 r(i) = r(i) - alpha*y(i)
561 ENDDO
562 DO i=1,nddl
563 z(i) = r(i) *diag_m(i)
564 ENDDO
565 CALL produt_v0(nddl,r,z,g1)
566 beta=g1/g0
567 CALL produt_v0(nddl,r,r,r2)
568C
569 g0 = g1
570
571 IF (it>=nlim) THEN
572 istop = 0
573 ELSEIF (r2<=toln) THEN
574 istop = 0
575 ELSE
576 istop = 1
577 ENDIF
578
579 DO WHILE (istop==1)
580 DO i=1,nddl
581 p(i) = z(i) + beta*p(i)
582 ENDDO
583 CALL mav_lt(
584 1 nddl ,ibid ,iadk ,jdik ,diag_k,
585 2 lt_k ,p ,y )
586 CALL produt_v0(nddl,p,y,s)
587 alpha=g0/s
588 DO i=1,nddl
589 x(i) = x(i) + alpha*p(i)
590 r(i) = r(i) - alpha*y(i)
591 ENDDO
592 DO i=1,nddl
593 z(i) = r(i) *diag_m(i)
594 ENDDO
595 CALL produt_v0(nddl,r,z,g1)
596 beta=g1/g0
597 g0 = g1
598 CALL produt_v0(nddl,r,r,r2)
599
600 IF (it>=nlim) THEN
601 istop = 0
602 ELSEIF (r2<=toln) THEN
603 istop = 0
604 ELSE
605 istop = 1
606 ENDIF
607
608 it = it +1
609 ENDDO
610 200 CONTINUE
611 IF(it>=nlim)THEN
612 isp =-1
613 ELSE
614 isp = 0
615 ENDIF
616C RR = SQRT(R2/R02)
617C WRITE(*,1002)IT,RR
618C--------X->R--------
619 DO i=1,nddl
620 r(i) = x(i)
621 ENDDO
622C--------------------------------------------
623 1002 FORMAT(3x,'TOTAL C.G. ITERATION=',i8,5x,
624 . ' RELATIVE RESIDUAL NORM=',e11.4)
625 1003 FORMAT(5x,
626 . '---WARNING : THE ITERATION LIMIT NUMBER WAS REACHED',
627 . 1x,'IN FSAI')
628 RETURN
629 END
#define my_real
Definition cppsort.cpp:32
#define alpha
Definition eval.h:35
subroutine sp_stat0(il, iadk, jdik, nc, jm)
Definition imp_fsa_inv.F:35
subroutine imp_fsai(n, iada, jdia, diag_a, lt_a, maxa, mj)
subroutine ind_lt2ln(nddl, iadk, jdik, lt_k, maxl)
subroutine spmd_max_s(s)
Definition imp_spmd.F:1195
#define max(a, b)
Definition macros.h:21
void floatmin(int *a, int *b, float *flm)
Definition precision.c:71
subroutine produt_v0(nddl, x, y, r)
Definition produt_v.F:944
subroutine mav_lt(nddl, nnz, iadl, jdil, diag_k, lt_k, v, w)
Definition produt_v.F:340
subroutine produt_v(nddl, x, y, r)
Definition produt_v.F:33
subroutine sms_pcg1(nddl, iadk, jdik, diag_k, lt_k, r, isp)
subroutine sms_check(timers, nodft, nodlt, iadk, jdik, diag_k, lt_k, iadi, jdii, lt_i, itask, itab, iad_elem, fr_elem, fr_sms, fr_rms, list_sms, list_rms, ams_work)
Definition sms_fsa_inv.F:48
subroutine sms_fsa_invh(nnzm, iadm, jdim, diag_m, lt_m, nndft0, nndft1, itask, diag_inv)
subroutine get_subsp_sms(iadm, jdim, diag_m, lt_m, nc, iada, jdia, diag_a, lt_a, jm, nndft0, nndft1)
subroutine spmd_nndft_sms(fr_sms, fr_rms, list_sms, list_rms, iad_elem, fr_elem, nndft0, nndft1, isortnd)
Definition spmd_sms.F:686
subroutine spmd_glob_lmin(lmin, imin)
Definition spmd_sms.F:555
subroutine spmd_nnz_sms(fr_sms, fr_rms, list_sms, list_rms, iad_elem, fr_elem, nnzm, iadk, kadm)
Definition spmd_sms.F:784
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)
Definition spmd_sms.F:924
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)
Definition message.F:889
subroutine arret(nn)
Definition arret.F:87
subroutine my_barrier
Definition machine.F:31
subroutine startime(event, itask)
Definition timer.F:93
subroutine stoptime(event, itask)
Definition timer.F:135