66 SUBROUTINE sms_pcg(TIMERS, NODFT ,NODLT ,NNZ ,IADK ,
67 2 JDIK ,DIAG_SMS ,LT_K ,R ,ISP ,
68 3 X_SMS ,P_SMS ,Z_SMS ,Y_SMS ,PREC_SMS,
69 4 NODFT1_SMS,NODLT1_SMS,INDX1_SMS,ICODT ,ICODR ,
70 5 ISKEW ,SKEW ,ITASK ,NODNX_SMS,IAD_ELEM,
71 6 FR_ELEM ,WEIGHT ,IBFV ,VEL ,NPC ,
72 7 TF ,V ,X ,D ,SENSOR_TAB,
73 8 IFRAME ,XFRAME ,JADI_SMS ,JDII_SMS ,NSENSOR ,
74 9 LTI_SMS ,FR_SMS ,FR_RMS ,LIST_SMS ,LIST_RMS,
75 A MSKYI_FI_SMS,VFI ,ISKYI_SMS,MSKYI_SMS ,
76 B RES_SMS ,ILINK ,LLINK ,FR_RL ,FRL6 ,
77 C NNLINK ,LNLINK ,FR_LL ,FNL6 ,MS ,
78 D TAG_LNK_SMS,ITAB ,FSAV ,LJOINT ,IADCJ ,
79 E FR_CJ ,CJWORK ,FRL ,FNL ,NPRW ,
80 F LPRW ,RWBUF ,RWSAV ,FOPT ,FR_WALL ,
81 G IRWL_WORK ,NRWL_SMS ,FREA ,INTSTAMP ,IMV ,
82 H MV ,MV6 ,MW6 ,KINET ,IXC ,
83 I IXTG ,SH4TREE ,SH3TREE ,CPTREAC ,NODREAC ,
84 J FTHREAC ,FRWL6 ,AM ,VR ,
85 K DR ,IN ,RBY ,NPBY ,LPBY ,
86 L TAGMSR_RBY_SMS,IRBE2 ,LRBE2 ,IAD_RBE2 ,FR_RBE2M,
87 M NMRBE2 ,R2SIZE ,IRBE3 ,LRBE3 ,FRBE3 ,
88 N IAD_RBE3M,FR_RBE3M ,FR_RBE3MP,RRBE3 ,RRBE3_PON ,
89 O PREC_SMS3,DIAG_SMS3,IAD_RBY ,FR_RBY6 ,RBY6 ,
90 P TAGSLV_RBY_SMS,R3SIZE,NODFT2_SMS,NODLT2_SMS,INDX2_SMS,
91 Q NODII_SMS ,IBCSCYC ,LBCSCYC ,WFEXT,AMS_WORK)
103#include "implicit_f.inc"
104#include "comlock.inc"
108#include "mvsiz_p.inc"
112#include "com01_c.inc"
113#include "com04_c.inc"
114#include "param_c.inc"
115#include "parit_c.inc"
116#include "remesh_c.inc"
117#include "scr03_c.inc"
118#include "scr07_c.inc"
121#include "timeri_c.inc"
122#include "units_c.inc"
127 TYPE(timer_),
INTENT(inout) :: TIMERS
128 INTEGER NODFT, NODLT, IADK(*), JDIK(*), NNZ, ISP,NSENSOR
131 . IAD_ELEM(2,NSPMD+1) ,FR_ELEM(*), WEIGHT(*),
132 . NPC(*), (NIFV,*),IFRAME(LISKN,*),
133 . JADI_SMS(*), JDII_SMS(*),
134 . FR_SMS(NSPMD+1), FR_RMS(NSPMD+1),
135 . LIST_SMS(*), LIST_RMS(*),ISKYI_SMS(*),
136 . ILINK(*), LLINK(*), FR_RL(NSPMD+2,*), NNLINK(10,*),
137 . LNLINK(*), FR_LL(NSPMD+2,*), TAG_LNK_SMS(*), ITAB(*),
138 . LJOINT(*), FR_CJ(*), IADCJ(*),
139 . NPRW(*), LPRW(*), FR_WALL(*), IRWL_WORK(*), NRWL_SMS(*),
140 . IMV(*), KINET(*),CPTREAC,NODREAC(*),
141 . IXC(NIXC,*), IXTG(NIXTG,*),
142 . SH4TREE(KSH4TREE,*), SH3TREE(KSH3TREE,*),
143 . NPBY(,*), LPBY(*), TAGMSR_RBY_SMS(*),
144 . IRBE2(NRBE2L,*), LRBE2(*), IAD_RBE2(*),
145 . FR_RBE2M(*), NMRBE2, R2SIZE, IRBE3(NRBE3L,*), LRBE3(*),
146 . IAD_RBE3M(*) ,FR_RBE3M(*) ,FR_RBE3MP(*),
147 . FR_RBY6(*),IAD_RBY(*), TAGSLV_RBY_SMS(*),R3SIZE,
148 . NODFT2_SMS,NODLT2_SMS,INDX2_SMS(*),NODII_SMS(*),
149 . IBCSCYC(*) ,LBCSCYC(*)
152 . diag_sms(*), lt_k(*) ,r(3,*),
153 . x_sms(3,*), p_sms(3,*), y_sms(3,*), z_sms(3,*), prec_sms(*),
154 . skew(*), v(3,*), x(3,*), d(3,*), tf(*), vel(lfxvelr,*),
155 . xframe(nxframe,*), lti_sms(*), res_sms(3,*),
156 . ms(*), fsav(nthvki,*), cjwork(*), frl(*), fnl(*),
157 . rwbuf(*), rwsav(*), fopt(*), frea(3,*),rbid,
158 . mskyi_fi_sms(*), mskyi_sms(*), vfi(*), mv(*),fthreac(6,*),
159 . am(3,*), vr(3,*), dr(3,*), in(*), rby(nrby,*),
160 . frbe3(*), rrbe3(*),
161 . prec_sms3(3,numnod), diag_sms3(3,numnod)
162 DOUBLE PRECISION FRL6(*), FNL6(*), MV6(*), MW6(*), (*),
164 DOUBLE PRECISION RBY6(8,6,NRBYKIN)
165 TYPE(INTSTAMP_DATA) INTSTAMP(*)
166 TYPE (SENSOR_STR_) ,
DIMENSION(NSENSOR) ,
INTENT(IN) :: SENSOR_TAB
167 DOUBLE PRECISION,
INTENT(INOUT) :: WFEXT
168 TYPE (ams_work_),
INTENT(INOUT) :: AMS_WORK
172 INTEGER I, IT, TOTIT, NLIM, N, L, K, LLT, IDOWN, J, IFLAG, ,
173 . NCPRIA, M, MSR, IAD, NSN, KI, NRBDIM
176 . st , r2t, r02t, g0t, g1t, res_old,
178 . xx, yy, zz, vrx, vry, vrz, v1, v2, v3, gx, gy, gz, a1, a2, a3
180 . r2(mvsiz), g(mvsiz), s(mvsiz), r02(mvsiz)
183 DOUBLE PRECISION R6T(6), G6T(6), S6T(6), DBUF(12)
185 IF(IMONM>0.AND.ITASK==0)call
startime(timers,61)
202 IF(nrbe2+r2size+nrbe3/=0)
THEN
203 DO n=nodft1_sms,nodlt1_sms
205 diag_sms3(1,i)=prec_sms(i)
206 diag_sms3(2,i)=prec_sms(i)
207 diag_sms3(3,i)=prec_sms(i)
212 DO n=nodft1_sms,nodlt1_sms
214 IF(prec_sms(i)==zero)
THEN
221 prec_sms(i)=one/prec_sms(i)
227 IF(nrbe2+r2size+nrbe3/=0)
THEN
228 IF (nrbe2>0.OR.r2size>0)
THEN
234 1 irbe2 ,lrbe2 ,diag_sms,ms ,diag_sms3,
235 1 skew ,weight ,iad_rbe2,fr_rbe2m ,nmrbe2)
247 1 irbe3 ,lrbe3 ,x ,diag_sms ,diag_sms3,
248 2 frbe3 ,skew ,weight ,iad_rbe3m,fr_rbe3m ,
249 3 fr_rbe3mp,rrbe3 ,rrbe3_pon ,r3size)
255 DO n=nodft1_sms,nodlt1_sms
257 IF(diag_sms3(1,i)==zero)
THEN
260 prec_sms3(1,i)=one/diag_sms3(1,i)
262 IF(diag_sms3(2,i)==zero)
THEN
265 prec_sms3(2,i)=one/diag_sms3(2,i)
267 IF(diag_sms3(3,i)==zero)
THEN
270 prec_sms3(3,i)=one/diag_sms3(3,i)
278 IF(nrlink+nlink+njoint+nadmesh > 0)
THEN
284 1 ms ,r ,ilink ,llink,skew,
285 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
289 1 ms ,r ,nnlink,lnlink,skew ,
290 2 fr_ll ,weight,fnl6 ,x ,xframe,
291 3 v ,idown ,tag_lnk_sms,itab,fnl)
295 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
309 IF (m_vs_sms > 0 )
THEN
310 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
311 IF(imonm>0.AND.itask==0)
CALL startime(timers,70)
314 1 iadk ,jdik ,diag_sms,lt_k ,itask ,
315 2 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
316 3 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
317 4 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
318 5 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
319 6 mv6 ,mw6 ,ms ,nodft ,nodlt ,
325 1 iadk ,jdik ,diag_sms,lt_k ,itask ,
326 2 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
327 3 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
328 4 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
329 5 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
330 6 mv6 ,mw6 ,ms ,nodft ,nodlt )
334 CALL sms_inix(timers,nodft,nodlt,numnod,x_sms,r ,weight,itask ,
337 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,70)
338 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
342 DO n=nodft1_sms,nodlt1_sms
345 x_sms(1,i) = r(1,i)*prec_sms(i)
346 x_sms(2,i) = r(2,i)*prec_sms(i)
347 x_sms(3,i) = r(3,i)*prec_sms(i)
358 CALL sms_rbe3t2(irbe3 ,lrbe3 ,x ,x_sms ,frbe3 ,
359 2 skew ,r ,prec_sms3 )
371 1 irbe2 ,lrbe2 ,r ,x_sms ,prec_sms3 ,
372 1 skew ,weight ,iad_rbe2 ,fr_rbe2m,nmrbe2)
379 IF(nrlink+nlink+njoint+nadmesh > 0)
THEN
385 1 ms ,x_sms ,ilink ,llink,skew,
386 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
390 1 ms ,x_sms ,nnlink,lnlink,skew ,
391 2 fr_ll ,weight,fnl6 ,x ,xframe,
392 3 v ,idown ,tag_lnk_sms,itab,fnl)
396 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
411 2 nprw ,ms ,fsav(1,ninter+1),fr_wall ,fopt ,
412 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
413 4 x_sms ,rbid ,rbid ,rbid ,wfext )
420 2 nprw ,ms ,fsav(1,ninter+1),fr_wall ,fopt ,
421 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
422 4 x_sms ,rbid ,rbid ,rbid ,wfext )
427 y_sms(1:3,nodft:nodlt)=zero
428 z_sms(1:3,nodft:nodlt)=zero
439 DO n=nodft1_sms,nodlt1_sms
444 x_sms(1,i)=x_sms(1,msr)
445 x_sms(2,i)=x_sms(2,msr)
446 x_sms(3,i)=x_sms(3,msr)
460 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
462 1 nodft ,nodlt ,numnod ,iadk ,jdik ,
463 2 itask ,diag_sms,lt_k ,x_sms ,z_sms ,
464 3 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
465 4 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
466 5 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
467 6 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
468 7 mv6 ,mw6 ,nodft2_sms,nodlt2_sms,indx2_sms,
471 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
490 . sh3tree ,nodnx_sms)
499 IF (nrbe2>0.OR.r2size>0)
THEN
506 1 irbe2 ,lrbe2 ,x_sms ,z_sms ,ms ,
507 1 skew ,weight ,iad_rbe2,fr_rbe2m,nmrbe2)
510 1 irbe2 ,lrbe2 ,x ,z_sms ,am ,
511 1 ms ,in ,skew ,weight ,iad_rbe2,
526 1 irbe3 ,lrbe3 ,x ,z_sms ,frbe3 ,
527 2 skew ,weight ,iad_rbe3m,fr_rbe3m,fr_rbe3mp,
528 3 rrbe3 ,rrbe3_pon ,r3size)
547 IF(tagmsr_rby_sms(msr) /= 0)
THEN
548 rby6(1,1,m)=z_sms(1,msr)*weight(msr)
549 rby6(2,1,m)=z_sms(2,msr)*weight(msr)
550 rby6(3,1,m)=z_sms(3,msr)*weight(msr)
561 IF(weight(i) /= 0)
THEN
562 rby6(1,1,m)=rby6(1,1,m)+z_sms(1,i)
563 rby6(2,1,m)=rby6(2,1,m)+z_sms(2,i)
564 rby6(3,1,m)=rby6(3,1,m)+z_sms(3,i)
574 1 nrbdim,iad_rby,fr_rby6,iad_rby(nspmd+1),rby6)
582 IF(tagmsr_rby_sms(msr) /= 0)
THEN
583 z_sms(1,msr)=rby6(1,1,m)
584 z_sms(2,msr)=rby6(2,1,m)
585 z_sms(3,msr)=rby6(3,1,m)
591 CALL sms_bcs(nodft1_sms,nodlt1_sms,indx1_sms,icodt ,iskew ,
592 2 skew ,z_sms ,nodlt1_sms )
596 IF (nbcscyc>0)
CALL sms_bcscyc(ibcscyc,lbcscyc,skew,x,z_sms)
600 IF(nrlink+nlink+njoint > 0)
THEN
606 1 ms ,z_sms ,ilink ,llink,skew,
607 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
611 1 ms ,z_sms ,nnlink,lnlink,skew ,
612 2 fr_ll ,weight,fnl6 ,x ,xframe,
613 3 v ,idown ,tag_lnk_sms,itab,fnl)
617 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
622 DO n=nodft1_sms,nodlt1_sms
624 res_sms(1,i) = r(1,i)-z_sms(1,i)
625 res_sms(2,i) = r(2,i)-z_sms(2,i)
626 res_sms(3,i) = r(3,i)-z_sms(3,i)
633 DO n=nodft1_sms,nodlt1_sms
653 2 vel ,diag_sms,x ,skew ,sensor_tab,
654 3 weight ,d ,iframe ,xframe ,nsensor ,
655 4 it+1 ,diag_sms,nodnx_sms,cptreac,nodreac,
656 5 fthreac,am ,vr ,dr ,in ,
670 2 nprw ,ms ,fsav(1,ninter+1),fr_wall ,fopt ,
671 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
672 4 rbid ,res_sms,rbid ,rbid ,wfext )
678 DO n=nodft1_sms,nodlt1_sms
680 z_sms(1,i) = res_sms(1,i) *prec_sms(i)
681 z_sms(2,i) = res_sms(2,i) *prec_sms(i)
682 z_sms(3,i) = res_sms(3,i) *prec_sms(i)
692 CALL sms_rbe3t2(irbe3 ,lrbe3 ,x ,z_sms ,frbe3 ,
693 2 skew ,res_sms ,prec_sms3 )
705 1 irbe2 ,lrbe2 ,res_sms,z_sms ,prec_sms3,
706 1 skew ,weight ,iad_rbe2 ,fr_rbe2m,nmrbe2)
713 IF(nrlink+nlink+njoint+nadmesh > 0)
THEN
719 1 ms ,z_sms ,ilink ,llink,skew,
720 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
724 1 ms ,z_sms ,nnlink,lnlink,skew ,
725 2 fr_ll ,weight,fnl6 ,x ,xframe,
726 3 v ,idown ,tag_lnk_sms,itab,fnl)
730 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
742 DO n=nodft1_sms,nodlt1_sms,mvsiz
744 llt=
min(nodlt1_sms-n+1,mvsiz)
748 p_sms(1,i) = z_sms(1,i)
749 p_sms(2,i) = z_sms(2,i)
750 p_sms(3,i) = z_sms(3,i)
751 g(l) = ( z_sms(1,i)*res_sms(1,i)
752 . + z_sms(2,i)*res_sms(2,i)
753 . + z_sms(3,i)*res_sms(3,i))
757 r2(l) = ( res_sms(1,i)*res_sms(1,i)
758 . + res_sms(2,i)*res_sms(2,i)
759 . + res_sms(3,i)*res_sms(3,i))
771 res0_sms=res0_sms+r02t
773#include "lockoff.inc"
779 IF(imonm>0.AND.itask==0)
CALL startime
782 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,62)
785 r6sms(k)=r6sms(k)+r6t(k)
786 g6sms(k)=g6sms(k)+g6t(k)
788#include "lockoff.inc"
796 IF(iparit/=0.AND.itask==0)
THEN
797 res0_sms=r6sms(1)+r6sms(2)+r6sms(3)+
798 . r6sms(4)+r6sms(5)+r6sms(6)
799 g0_sms =g6sms(1)+g6sms(2)+g6sms(3)+
800 . g6sms(4)+g6sms(5)+g6sms(6)
804 IF(imonm>0)
CALL startime(timers,63)
811 IF(imonm>0)
CALL stoptime(timers,63)
819 rbuf(1) = dbuf(1)+dbuf(2)+dbuf(3)+
820 . dbuf(4)+dbuf(5)+dbuf(6)
821 rbuf(2) = dbuf(7) +dbuf(8) +dbuf(9)+
822 . dbuf(10)+dbuf(11)+dbuf(12)
826 IF(imonm>0)
CALL stoptime(timers,63)
836 DO n=nodft1_sms,nodlt1_sms
841 p_sms(1,i)=p_sms(1,msr)
842 p_sms(2,i)=p_sms(2,msr)
843 p_sms(3,i)=p_sms(3,msr)
854 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
855 IF (res0_sms<em10)
GOTO 200
856 toln=res0_sms*tol_sms
865 IF (m_vs_sms > 0 )
THEN
866 IF(imonm>0.AND.itask==0)
CALL startime(timers,70)
868 CALL sms_pro_p(timers,nodft ,nodlt ,numnod ,p_sms,weight,itask ,
875 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,70)
881 1 nodft ,nodlt ,numnod ,iadk ,jdik ,
882 2 itask ,diag_sms,lt_k ,p_sms ,y_sms ,
883 3 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
884 4 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
885 5 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
886 6 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
887 7 mv6 ,mw6 ,nodft2_sms,nodlt2_sms,indx2_sms,
890 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
913 . sh3tree ,nodnx_sms)
922 IF (nrbe2>0.OR.r2size>0)
THEN
929 1 irbe2 ,lrbe2 ,p_sms ,y_sms ,ms ,
930 1 skew ,weight ,iad_rbe2,fr_rbe2m,nmrbe2)
933 1 irbe2 ,lrbe2 ,x ,y_sms ,am ,
934 1 ms ,in ,skew ,weight ,iad_rbe2,
949 1 irbe3 ,lrbe3 ,x ,y_sms ,frbe3 ,
950 2 skew ,weight ,iad_rbe3m,fr_rbe3m,fr_rbe3mp,
951 3 rrbe3 ,rrbe3_pon ,r3size)
972 IF(tagmsr_rby_sms(msr) /= 0)
THEN
973 rby6(1,1,m)=y_sms(1,msr)*weight(msr)
974 rby6(2,1,m)=y_sms(2,msr)*weight(msr)
975 rby6(3,1,m)=y_sms(3,msr)*weight(msr)
986 IF(weight(i) /= 0)
THEN
987 rby6(1,1,m)=rby6(1,1,m)+y_sms(1,i)
988 rby6(2,1,m)=rby6(2,1,m)+y_sms(2,i)
989 rby6(3,1,m)=rby6(3,1,m)+y_sms(3,i)
1002 1 nrbdim,iad_rby,fr_rby6,iad_rby(nspmd+1),rby6)
1011 IF(tagmsr_rby_sms(msr) /= 0)
THEN
1012 y_sms(1,msr)=rby6(1,1,m)
1013 y_sms(2,msr)=rby6(2,1,m)
1014 y_sms(3,msr)=rby6(3,1,m)
1021 CALL sms_bcs(nodft1_sms,nodlt1_sms,indx1_sms,icodt ,iskew ,
1022 2 skew ,y_sms ,nodlt1_sms )
1024 IF (nbcscyc>0)
CALL sms_bcscyc(ibcscyc,lbcscyc,skew,x,y_sms)
1028 IF(nrlink+nlink+njoint > 0)
THEN
1034 1 ms ,y_sms ,ilink ,llink,skew,
1035 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
1039 1 ms ,y_sms ,nnlink,lnlink,skew ,
1040 2 fr_ll ,weight,fnl6 ,x ,xframe,
1041 3 v ,idown ,tag_lnk_sms,itab,fnl)
1044 .
CALL sms_cjoint_1(y_sms ,diag_sms,ljoint,iadcj,fr_cj,
1045 . cjwork,idown ,tag_lnk_sms(nrlink+nlink
1055 2 nprw ,ms ,fsav(1,ninter+1),fr_wall ,fopt ,
1056 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
1057 4 rbid ,y_sms ,rbid ,rbid ,wfext )
1063 DO n=nodft1_sms,nodlt1_sms,mvsiz
1065 llt=
min(nodlt1_sms-n+1,mvsiz)
1070 . + p_sms(2,i)*y_sms(2,i)
1071 . + p_sms(3,i)*y_sms(3,i))*weight(i)
1079#include "lockon.inc"
1081#include "lockoff.inc"
1086 IF(imonm>0.AND.itask==0)
CALL startime(timers,62)
1088 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,62)
1089#include "lockon.inc"
1091 s6sms(k)=s6sms(k)+s6t(k)
1093#include "lockoff.inc"
1101 IF(iparit/=0.AND.itask==0)
THEN
1102 s_sms=s6sms(1)+s6sms(2)+s6sms(3)+
1103 . s6sms(4)+s6sms(5)+s6sms(6)
1105 ELSEIF(itask==0)
THEN
1107 IF(imonm>0.AND.itask==0)
CALL startime(timers,63)
1110 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,63)
1112 IF(imonm>0.AND.itask==0)
CALL startime(timers,63)
1117 s_sms = dbuf(1)+dbuf(2)+dbuf(3)+
1118 . dbuf(4)+dbuf(5)+dbuf(6)
1120 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,63)
1126 alpha=g0_sms/
max(em30,s_sms)
1129 DO n=nodft1_sms,nodlt1_sms
1131 x_sms(1,i) = x_sms(1,i) + alpha*p_sms(1,i)
1132 x_sms(2,i) = x_sms(2,i) + alpha*p_sms(2,i)
1133 x_sms(3,i) = x_sms(3,i) + alpha*p_sms(3,i)
1134 res_sms(1,i) = res_sms(1,i) - alpha*y_sms(1,i)
1135 res_sms(2,i) = res_sms(2,i) - alpha*y_sms(2,i)
1136 res_sms(3,i) = res_sms(3,i) - alpha*y_sms(3,i)
1144 .
CALL sms_fixvel(ibfv ,res_sms ,v ,npc ,tf ,
1145 2 vel ,diag_sms,x ,skew ,sensor_tab,
1146 3 weight ,d ,iframe,xframe ,nsensor ,
1147 4 it+1 ,diag_sms,nodnx_sms,cptreac,nodreac,
1148 5 fthreac,am ,vr ,dr ,in ,
1155 DO n=nodft1_sms,nodlt1_sms
1157 z_sms(1,i) = res_sms(1,i) *prec_sms(i)
1158 z_sms(2,i) = res_sms(2,i) *prec_sms(i)
1159 z_sms(3,i) = res_sms(3,i) *prec_sms(i)
1169 CALL sms_rbe3t2(irbe3 ,lrbe3 ,x ,z_sms ,frbe3 ,
1170 2 skew ,res_sms ,prec_sms3 )
1182 1 irbe2 ,lrbe2 ,res_sms,z_sms ,prec_sms3,
1183 1 skew ,weight ,iad_rbe2 ,fr_rbe2m,nmrbe2)
1190 IF(nrlink+nlink+njoint+nadmesh > 0)
THEN
1196 1 ms ,z_sms ,ilink ,llink,skew,
1197 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
1201 1 ms ,z_sms ,nnlink,lnlink,skew ,
1202 2 fr_ll ,weight,fnl6 ,x ,xframe,
1203 3 v ,idown ,tag_lnk_sms,itab,fnl)
1206 .
CALL sms_cjoint_1(z_sms ,diag_sms,ljoint,iadcj,fr_cj,
1207 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
1218 DO n=nodft1_sms,nodlt1_sms,mvsiz
1220 llt=
min(nodlt1_sms-n+1,mvsiz)
1224 r2(l) = ( res_sms(1,i)*res_sms(1,i)
1225 . + res_sms(2,i)*res_sms(2,i)
1226 . + res_sms(3,i)*res_sms(3,i))
1228 g(l) = ( z_sms(1,i)*res_sms(1,i
1230 . + z_sms(3,i)*res_sms(3,i))
1241#include "lockon.inc"
1242 res1_sms= res1_sms+ r2t
1243 g1_sms = g1_sms + g1t
1244#include "lockoff.inc"
1250 IF(imonm>0.AND.itask==0)
CALL startime(timers,62)
1253 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,62)
1254#include "lockon.inc"
1256 r6sms(k)=r6sms(k)+r6t(k)
1257 g6sms(k)=g6sms(k)+g6t(k)
1259#include "lockoff.inc"
1267 IF(iparit/=0.AND.itask==0)
THEN
1268 res1_sms=r6sms(1)+r6sms(2)+r6sms(3)+
1269 . r6sms(4)+r6sms(5)+r6sms(6)
1270 g1_sms =g6sms(1)+g6sms(2)+g6sms(3)+
1271 . g6sms(4)+g6sms(5)+g6sms(6)
1273 ELSEIF(itask==0)
THEN
1275 IF(imonm>0)
CALL startime(timers,63)
1282 IF(imonm>0)
CALL stoptime(timers,63)
1284 IF(imonm>0)
CALL startime(timers,63)
1290 rbuf(1) = dbuf(1)+dbuf(2)+dbuf(3)+
1291 . dbuf(4)+dbuf(5)+dbuf(6)
1292 rbuf(2) = dbuf(7) +dbuf(8) +dbuf(9)+
1293 . dbuf(10)+dbuf(11)+dbuf(12)
1297 IF(imonm>0)
CALL stoptime(timers,63)
1305 if(itask==0.and.ispmd==0
1306 . .and.(ncprisms < 0 .and.
1307 . mod(ncycle,ncpria)==0))
then
1308 write(iout,1002) ncycle,totit,res1_sms,toln
1312 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
1313 IF(it>=nlim.OR.res1_sms<=toln)
GO TO 200
1314 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
1316 beta=g1_sms/
max(em30,g0_sms)
1324 DO n=nodft1_sms,nodlt1_sms
1326 p_sms(1,i) = z_sms(1,i) + beta*p_sms(1,i)
1327 p_sms(2,i) = z_sms(2,i) + beta*p_sms(2,i)
1328 p_sms(3,i) = z_sms(3,i) + beta*p_sms(3,i)
1337 DO n=nodft1_sms,nodlt1_sms
1342 p_sms(1,i)=p_sms(1,msr)
1343 p_sms(2,i)=p_sms(2,msr)
1344 p_sms(3,i)=p_sms(3,msr)
1355 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
1363 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
1366 IF(ispmd==0.AND.itask==0)
THEN
1367#include "lockon.inc"
1369 .
' ** ERROR : AMS IS LIKELY DIVERGING '
1370 WRITE(iout,1100) nlim,ncycle
1371#include "lockoff.inc"
1378 CALL sms_check(timers, nodft ,nodlt ,iadk ,jdik ,diag_sms,
1379 2 lt_k ,jadi_sms ,jdii_sms ,lti_sms ,itask ,
1380 3 itab ,iad_elem ,fr_elem ,fr_sms ,fr_rms ,
1381 4 list_sms,list_rms,ams_work)
1394 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
1396 1 nodft ,nodlt ,numnod ,iadk ,jdik ,
1397 2 itask ,diag_sms,lt_k ,x_sms ,z_sms ,
1398 3 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
1399 4 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
1400 5 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
1401 6 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
1402 7 mv6 ,mw6 ,nodft2_sms,nodlt2_sms,indx2_sms,
1405 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
1412 . sh3tree ,nodnx_sms)
1421 IF (nrbe2>0.OR.r2size>0)
THEN
1428 1 irbe2 ,lrbe2 ,x_sms ,z_sms ,ms ,
1429 1 skew ,weight ,iad_rbe2,fr_rbe2m,nmrbe2)
1432 1 irbe2 ,lrbe2 ,x ,z_sms ,am ,
1433 1 ms ,in ,skew ,weight ,iad_rbe2,
1448 1 irbe3 ,lrbe3 ,x ,z_sms ,frbe3 ,
1449 2 skew ,weight ,iad_rbe3m,fr_rbe3m,fr_rbe3mp,
1450 3 rrbe3 ,rrbe3_pon ,r3size)
1469 IF(tagmsr_rby_sms(msr) /= 0)
THEN
1470 rby6(1,1,m)=z_sms(1,msr)*weight(msr)
1471 rby6(2,1,m)=z_sms(2,msr)*weight(msr)
1472 rby6(3,1,m)=z_sms(3,msr)*weight(msr)
1483 IF(weight(i) /= 0)
THEN
1484 rby6(1,1,m)=rby6(1,1,m)+z_sms(1,i)
1485 rby6(2,1,m)=rby6(2,1,m)+z_sms(2,i)
1486 rby6(3,1,m)=rby6(3,1,m)+z_sms(3,i)
1496 1 nrbdim,iad_rby,fr_rby6,iad_rby(nspmd+1),rby6)
1504 IF(tagmsr_rby_sms(msr) /= 0)
THEN
1505 z_sms(1,msr)=rby6(1,1,m)
1506 z_sms(2,msr)=rby6(2,1,m)
1507 z_sms(3,msr)=rby6(3,1,m)
1515 CALL sms_bcs(nodft1_sms,nodlt1_sms,indx1_sms,icodt ,iskew ,
1516 2 skew ,z_sms ,nodlt1_sms )
1520 IF (nbcscyc>0)
CALL sms_bcscyc(ibcscyc,lbcscyc,skew,x,z_sms)
1524 IF(nrlink+nlink+njoint > 0)
THEN
1530 1 ms ,z_sms ,ilink ,llink,skew,
1531 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
1535 1 ms ,z_sms ,nnlink,lnlink,skew ,
1536 2 fr_ll ,weight,fnl6 ,x ,xframe,
1537 3 v ,idown ,tag_lnk_sms,itab,fnl)
1540 .
CALL sms_cjoint_1(z_sms ,diag_sms,ljoint,iadcj,fr_cj,
1541 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
1546 IF(ifricw/=0.AND.iact==0)
THEN
1550 DO n=nodft1_sms,nodlt1_sms
1553 res_sms(1,i) = r(1,i)-z_sms(1,i)
1554 res_sms(2,i) = r(2,i)-z_sms(2,i)
1555 res_sms(3,i) = r(3,i)-z_sms(3,i)
1562 DO n=nodft1_sms,nodlt1_sms
1578 2 nprw ,ms ,fsav(1,ninter+1),fr_wall ,fopt ,
1579 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
1580 4 x_sms ,res_sms,r ,frea ,wfext)
1585 DO n=nodft1_sms,nodlt1_sms
1589 frea(1,i) = frea(1,i)+r(1,i)-z_sms(1,i)
1590 frea(2,i) = frea(2,i)+r(2,i)-z_sms(2,i)
1591 frea(3,i) = frea(3,i)+r(3,i)-z_sms(3,i)
1601 DO n=nodft1_sms,nodlt1_sms
1617 2 nprw ,ms ,fsav(1,ninter+1),fr_wall ,fopt ,
1618 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
1619 4 x_sms ,res_sms,r ,frea ,wfext
1628 DO n=nodft1_sms,nodlt1_sms
1634 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
1636 IF (m_vs_sms > 0 .AND. it > 0)
THEN
1637 IF(imonm>0.AND.itask==0)
CALL startime(timers,70)
1639 1 iadk ,jdik ,diag_sms,lt_k ,itask ,
1640 2 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
1641 3 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
1642 4 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
1643 5 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
1644 6 mv6 ,mw6 ,ms ,x_sms
1649 IF (itask == 0) ncg_run_sms = ncg_run_sms
1650 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,70)
1654 if(itask==0.and.ispmd==0
1655 . .and.(ncprisms/=0.and.mod(ncycle,ncpria)==0))
then
1657 write(iout,1000) ncycle,totit
1659 write(iout,1001) ncycle,totit,res1_sms,toln
1664 1000
FORMAT(3x,
'CYCLE NUMBER',i5,
1665 .
' TOTAL C.G. ITERATION NUMBER=',i5)
1666 1001
FORMAT(3x,
'CYCLE NUMBER',i5,
1667 .
' TOTAL C.G. ITERATION NUMBER=',i5,
1668 .
' RELATIVE RESIDUAL NORM=',e11.4,
1669 .
' REFERENCE RESIDUAL NORM',e11.4)
1670 1002
FORMAT(3x,
'CYCLE NUMBER',i5,
1671 .
' ITERATION NUMBER=',i5,
1672 .
' RELATIVE RESIDUAL NORM=',e11.4,
1673 .
' REFERENCE RESIDUAL NORM',e11.4)
1675 .
' ** ERROR : AMS IS LIKELY DIVERGING:'
1676 .
' TOTAL C.G. ITERATION NUMBER = ',i8,
' AT CYCLE NUMBER ',i8)
1699 2 ITASK ,DIAG_K ,LT_K ,V ,W ,
1700 3 NODFT1_SMS,NODLT1_SMS,INDX1_SMS,NODNX_SMS,IAD_ELEM ,
1701 4 FR_ELEM ,WEIGHT ,JADI_SMS ,JDII_SMS ,LTI_SMS ,
1702 5 ISKYI_SMS ,MSKYI_SMS ,FR_SMS ,FR_RMS ,LIST_SMS ,
1703 6 LIST_RMS ,MSKYI_FI_SMS,VFI ,IMV ,MV ,
1704 7 MV6 ,MW6 ,NODFT2_SMS,NODLT2_SMS,INDX2_SMS,
1714#include "implicit_f.inc"
1718#include "com01_c.inc"
1719#include "parit_c.inc"
1721#include "task_c.inc"
1722#include "timeri_c.inc"
1723#include "warn_c.inc"
1727 TYPE(timer_) ,
INTENT(INOUT) :: timers
1728 INTEGER nodft, nodlt, itask, numnod, iadl(*) ,JDIL(*),
1729 . NODFT1_SMS,,INDX1_SMS(*), NODNX_SMS(*),
1730 . nodft2_sms,nodlt2_sms,indx2_sms(*), nodii_sms(*),
1731 . iad_elem(2,nspmd+1) ,fr_elem(*),weight(*),
1732 . jadi_sms(*),jdii_sms(*),
1733 . iskyi_sms(lskyi_sms,*),fr_sms(nspmd+1),fr_rms(nspmd+1),
1734 . list_sms(*), list_rms(*), imv(*)
1737 . diag_k(*), w(*), lt_k(*) ,v(*), lti_sms(*), mskyi_sms(*),
1738 . mskyi_fi_sms(*), vfi(*), mv(*)
1739 DOUBLE PRECISION MV6(6,3,*), MW6(6,3,*)
1743 INTEGER I,J,K,I3,I2,I1,K3,K2,K1,N, LOC_PROC, M, KK,
1744 . KMV,KMV3,KMV2,KMV1
1745 INTEGER SIZE, LENR, JAD, DIR, L, LLT,
1746 . IAD_SEND(NSPMD+1),IAD_RECV(NSPMD+1),
1747 . REQ_R(NSPMD),REQ_S(NSPMD)
1750 my_real,
DIMENSION(:),
ALLOCATABLE :: RBUF
1751 my_real,
DIMENSION(:),
ALLOCATABLE :: SBUF
1754 CALL my_alloc(rbuf,3*(fr_rms(nspmd+1)+fr_sms(nspmd+1)))
1755 CALL my_alloc(sbuf,3*(fr_rms(nspmd+1)+fr_sms(nspmd+1)))
1760 IF(idtmins==2.OR.idtmins_int/=0)
THEN
1769 IF(imonm>0)
CALL startime(timers,65)
1771 . fr_sms,list_rms,list_sms,1,
1772 . iad_send,iad_recv,req_r,req_s,rbuf,sbuf)
1779 IF(imonm>0.AND.itask==0)
CALL startime(timers,64)
1780 IF(imonm>0.AND.itask==0)
CALL startime(timers,74)
1783 IF(iparit==0.OR.debug(9)==0)
THEN
1785 DO n=nodft1_sms,nodlt1_sms
1790 w(i3)=diag_k(i)*v(i3)*weight(i)
1791 w(i2)=diag_k(i)*v(i2)*weight(i)
1792 w(i1)=diag_k(i)*v(i1)*weight(i)
1796 DO n=nodft1_sms,nodlt1_sms
1801 DO j =iadl(i),iadl(i+1)-1
1807 w(i3) = w(i3) + l_k*v(k3)
1808 w(i2) = w(i2) + l_k*v(k2)
1809 w(i1) = w(i1) + l_k*v(k1)
1821 DO n=nodft1_sms,nodlt1_sms
1832 DO n=nodft1_sms,nodlt1_sms
1842 mv(kmv3)=diag_k(i)*v(i3)*weight(i)
1843 mv(kmv2)=diag_k(i)*v(i2)*weight(i)
1844 mv(kmv1)=diag_k(i)*v(i1)*weight(i)
1845 DO j =iadl(i),iadl(i+1)-1
1867 IF(imonm>0)
CALL stoptime(timers,74)
1870 IF(idtmins==2.OR.idtmins_int/=0)
THEN
1873 DO n=nodft2_sms,nodlt2_sms
1878 DO j =jadi_sms(i),jadi_sms(i+1)-1
1884 w(i3) = w(i3) +l_k*v(k3)
1885 w(i2) = w(i2) +l_k*v(k2)
1886 w(i1) = w(i1) +l_k*v(k1)
1897 IF(imonm>0)
CALL stoptime(timers,64)
1900 IF(imonm>0)
CALL startime(timers,65)
1902 . fr_sms,list_rms,list_sms,2,
1903 . iad_send,iad_recv,req_r,req_s,rbuf,sbuf)
1904 IF(imonm>0)
CALL stoptime(timers,65)
1914 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,64)
1917 IF(imonm>0.AND.itask==0)
CALL startime(timers,64)
1927 DO k=fr_rms(l),fr_rms(l+1)-1
1937 w(i3) = w(i3) -mskyi_fi_sms(k)*vfi(k3)
1938 w(i2) = w(i2) -mskyi_fi_sms(k)*vfi(k2)
1939 w(i1) = w(i1) -mskyi_fi_sms(k)*vfi(k1)
1943 DO k=fr_sms(l),fr_sms(l+1)-1
1954 w(i3) = w(i3) -mskyi_sms(k)*vfi(k3)
1955 w(i2) = w(i2) -mskyi_sms(k)*vfi(k2)
1956 w(i1) = w(i1) -mskyi_sms(k)*vfi(k1)
1966 IF(imonm>0)
CALL stoptime(timers,64)
1969 lenr = iad_elem(1,nspmd+1)-iad_elem(1,1)
1970 IF(imonm>0)
CALL startime(timers,80)
1973 IF(imonm>0)
CALL stoptime(timers,80)
1984 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,64)
1988 ELSEIF(debug(9)==0)
THEN
1992 DO n=nodft2_sms,nodlt2_sms
1994 DO j =jadi_sms(i),jadi_sms(i+1)-1
2021 DO k=fr_rms(l),fr_rms(l+1)-1
2024 IF(i == 0 .OR. nodii_sms(i) < nodft2_sms .OR.
2025 . nodlt2_sms < nodii_sms(i))cycle
2034 mv(kmv3) = -mskyi_fi_sms(k)*vfi(k3)
2035 mv(kmv2) = -mskyi_fi_sms(k)*vfi(k2)
2036 mv(kmv1) = -mskyi_fi_sms(k)*vfi(k1)
2040 DO k=fr_sms(l),fr_sms(l+1)-1
2044 IF(i == 0 .OR. nodii_sms(i) < nodft2_sms .OR.
2045 . nodlt2_sms < nodii_sms(i))cycle
2054 mv(kmv3) = -mskyi_sms(k)*vfi(k3)
2055 mv(kmv2) = -mskyi_sms(k)*vfi(k2)
2056 mv(kmv1) = -mskyi_sms(k)*vfi(k1)
2066 DO n=nodft2_sms,nodlt2_sms
2078 mw6(j,1,i) = mw6(j,1,i)+mv6(j,1,k)
2079 mw6(j,2,i) = mw6(j,2,i)+mv6(j,2,k)
2080 mw6(j,3,i) = mw6(j,3,i)+mv6(j,3,k)
2084 DO n=nodft2_sms,nodlt2_sms
2090 . +mw6(1,3,i)+mw6(2,3,i)+mw6(3,3,i)
2091 . +mw6(4,3,i)+mw6(5,3,i)+mw6(6,3,i)
2093 . +mw6(1,2,i)+mw6(2,2,i)+mw6(3,2,i)
2094 . +mw6(4,2,i)+mw6(5,2,i)+mw6(6,2,i)
2096 . +mw6(1,1,i)+mw6(2,1,i)+mw6(3,1,i)
2097 . +mw6(4,1,i)+mw6(5,1,i)+mw6(6,1,i)
2105 IF(imonm>0)
CALL stoptime(timers,64)
2108 lenr = iad_elem(1,nspmd+1)-iad_elem(1,1)
2109 IF(imonm>0)
CALL startime(timers,80)
2112 IF(imonm>0)
CALL stoptime(timers,80)
2123 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,64)
2131 DO n=nodft1_sms,nodlt1_sms
2133 DO j =jadi_sms(i),jadi_sms(i+1)-1
2160 DO k=fr_rms(l),fr_rms(l+1)-1
2163 IF(i == 0 .OR. nodnx_sms(i) < nodft1_sms .OR.
2164 . nodlt1_sms < nodnx_sms(i))cycle
2173 mv(kmv3) = -mskyi_fi_sms(k)*vfi(k3)
2174 mv(kmv2) = -mskyi_fi_sms(k)*vfi(k2)
2175 mv(kmv1) = -mskyi_fi_sms(k)*vfi(k1)
2179 DO k=fr_sms(l),fr_sms(l+1)-1
2183 IF(i == 0 .OR. nodnx_sms(i) < nodft1_sms .OR.
2184 . nodlt1_sms < nodnx_sms(i))cycle
2193 mv(kmv3) = -mskyi_sms(k)*vfi(k3)
2194 mv(kmv2) = -mskyi_sms(k)*vfi(k2)
2195 mv(kmv1) = -mskyi_sms(k)*vfi(k1)
2217 mw6(j,1,i) = mw6(j,1,i)+mv6(j,1,k)
2219 mw6(j,3,i) = mw6(j,3,i)+mv6(j,3,k)
2228 IF(imonm>0)
CALL stoptime(timers,64)
2231 lenr = iad_elem(1,nspmd+1)-iad_elem(1,1)
2232 IF(imonm>0)
CALL startime(timers,80)
2235 IF(imonm>0)
CALL stoptime(timers,80)
2242 IF(imonm>0.AND.itask==0)
CALL startime(timers,64)
2244 DO n=nodft1_sms,nodlt1_sms
2249 w(i3) = mw6(1,3,i)+mw6(2,3,i)+mw6(3,3,i)
2250 . +mw6(4,3,i)+mw6(5,3,i)+mw6
2251 w(i2) = mw6(1,2,i)+mw6(2,2,i)+mw6(3,2,i)
2252 . +mw6(4,2,i)+mw6(5,2,i)+mw6(6,2,i)
2253 w(i1) = mw6(1,1,i)+mw6(2,1,i)+mw6(3,1,i)
2254 . +mw6(4,1,i)+mw6(5,1,i)+mw6(6,1,i)
2260 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,64)
2269 IF(imonm>0)
CALL stoptime(timers,64)
2273 lenr = iad_elem(1,nspmd+1)-iad_elem(1,1)
2274 IF(imonm>0)
CALL startime(timers,65)
2277 IF(imonm>0)
CALL stoptime(timers,65)