67 SUBROUTINE sms_pcg(TIMERS, NODFT ,NODLT ,NNZ ,IADK ,
68 2 JDIK ,DIAG_SMS ,LT_K ,R ,ISP ,
69 3 X_SMS ,P_SMS ,Z_SMS ,Y_SMS ,PREC_SMS,
70 4 NODFT1_SMS,NODLT1_SMS,INDX1_SMS,ICODT ,ICODR ,
71 5 ISKEW ,SKEW ,ITASK ,NODNX_SMS,IAD_ELEM,
72 6 FR_ELEM ,WEIGHT ,IBFV ,VEL ,NPC ,
73 7 TF ,V ,X ,D ,SENSOR_TAB,
74 8 IFRAME ,XFRAME ,JADI_SMS ,JDII_SMS ,NSENSOR ,
75 9 LTI_SMS ,FR_SMS ,FR_RMS ,LIST_SMS ,LIST_RMS,
76 A MSKYI_FI_SMS,VFI ,ISKYI_SMS,MSKYI_SMS ,
77 B RES_SMS ,ILINK ,LLINK ,FR_RL ,FRL6 ,
78 C NNLINK ,LNLINK ,FR_LL ,FNL6 ,MS ,
79 D TAG_LNK_SMS,ITAB ,FSAV ,LJOINT ,IADCJ ,
80 E FR_CJ ,CJWORK ,FRL ,FNL ,NPRW ,
81 F LPRW ,RWBUF ,RWSAV ,FOPT ,FR_WALL ,
82 G IRWL_WORK ,NRWL_SMS ,FREA ,INTSTAMP ,IMV ,
83 H MV ,MV6 ,MW6 ,KINET ,IXC ,
84 I IXTG ,SH4TREE ,SH3TREE ,CPTREAC ,NODREAC ,
85 J FTHREAC ,FRWL6 ,AM ,VR ,
86 K DR ,IN ,RBY ,NPBY ,LPBY ,
87 L TAGMSR_RBY_SMS,IRBE2 ,LRBE2 ,IAD_RBE2 ,FR_RBE2M,
88 M NMRBE2 ,R2SIZE ,IRBE3 ,LRBE3 ,FRBE3 ,
89 N IAD_RBE3M,FR_RBE3M ,FR_RBE3MP,RRBE3 ,RRBE3_PON ,
90 O PREC_SMS3,DIAG_SMS3,IAD_RBY ,FR_RBY6 ,RBY6 ,
91 P TAGSLV_RBY_SMS,R3SIZE,NODFT2_SMS,NODLT2_SMS,INDX2_SMS,
92 Q NODII_SMS ,IBCSCYC ,LBCSCYC ,WFEXT,AMS_WORK)
101 use element_mod ,
only : nixc,nixtg
105#include
"implicit_f.inc"
106#include "comlock.inc"
110#include "mvsiz_p.inc"
114#include "com01_c.inc"
115#include "com04_c.inc"
116#include "param_c.inc"
117#include "parit_c.inc"
118#include "remesh_c.inc"
119#include "scr03_c.inc"
120#include "scr07_c.inc"
123#include "timeri_c.inc"
124#include "units_c.inc"
129 TYPE(timer_),
INTENT(inout) :: TIMERS
130 INTEGER NODFT, NODLT, IADK(*), JDIK(*), NNZ, ISP,NSENSOR,
131 . NODFT1_SMS,NODLT1_SMS,INDX1_SMS(*),
132 . ICODT(*), ICODR(*), ISKEW(*), ITASK, NODNX_SMS(*),
133 . IAD_ELEM(2,+1) ,FR_ELEM(*), WEIGHT(*),
134 . NPC(*), IBFV(NIFV,*),IFRAME(LISKN,*),
135 . JADI_SMS(*), JDII_SMS(*),
136 . FR_SMS(NSPMD+1), FR_RMS(NSPMD+1),
137 . LIST_SMS(*), LIST_RMS(*),ISKYI_SMS(*),
138 . ILINK(*), LLINK(*), FR_RL(NSPMD+2,*), NNLINK(10,*),
139 . LNLINK(*), FR_LL(NSPMD+2,*), TAG_LNK_SMS(*)
144 . SH4TREE(KSH4TREE,*), SH3TREE(KSH3TREE,*),
145 . (NNPBY,*), (*), (*),
146 . IRBE2(NRBE2L,*), LRBE2(*), IAD_RBE2(*),
147 . FR_RBE2M(*), NMRBE2, R2SIZE, IRBE3(NRBE3L,*), LRBE3(*),
148 . IAD_RBE3M(*) ,FR_RBE3M(*) ,FR_RBE3MP(*),
149 . FR_RBY6(*),IAD_RBY(*), TAGSLV_RBY_SMS(*),R3SIZE,
150 . NODFT2_SMS,NODLT2_SMS,INDX2_SMS(*),NODII_SMS(*),
151 . IBCSCYC(*) ,LBCSCYC(*)
154 . diag_sms(*), lt_k(*) ,r(3,*),
155 . x_sms(3,*), p_sms(3,*), y_sms(3,*), z_sms(3,*), prec_sms(*),
156 . skew(*), v(3,*), x(3,*), d(3,*), tf(*), vel(lfxvelr,*),
157 . xframe(nxframe,*), lti_sms(*), res_sms(3,*),
158 . ms(*), fsav(nthvki,*), cjwork(*), frl(*), fnl(*),
159 . rwbuf(*), rwsav(*), fopt(*), frea(3,*),rbid,
160 . mskyi_fi_sms(*), mskyi_sms(*), vfi(*), mv(*),fthreac(6,*),
161 . am(3,*), vr(3,*), dr(3,*), in(*), rby(nrby,*),
162 . frbe3(*), rrbe3(*),
163 . prec_sms3(3,numnod), diag_sms3(3,numnod)
164 DOUBLE PRECISION FRL6(*), FNL6(*), MV6(*), MW6(*), FRWL6(*),
166 DOUBLE PRECISION (8,6,NRBYKIN)
167 TYPE(INTSTAMP_DATA) INTSTAMP(*)
168 TYPE (SENSOR_STR_) ,
DIMENSION(NSENSOR) ,
INTENT(IN) :: SENSOR_TAB
169 DOUBLE PRECISION,
INTENT(INOUT) :: WFEXT
170 TYPE (ams_work_),
INTENT(INOUT) ::
174 INTEGER I, IT, TOTIT, NLIM, N, L, K, LLT, IDOWN, IFLAG
180 . xx, yy, zz, vrx, vry, vrz, v1, v2, v3, gx, gy, gz, a1, a2, a3
182 . r2(mvsiz), g(mvsiz), s(mvsiz), r02(mvsiz)
185 DOUBLE PRECISION R6T(6), G6T(6), S6T(6), DBUF(12)
187 IF(IMONM>0.AND.ITASK==0)call
startime(timers,61)
204 IF(nrbe2+r2size+nrbe3/=0)
THEN
205 DO n=nodft1_sms,nodlt1_sms
207 diag_sms3(1,i)=prec_sms(i)
208 diag_sms3(2,i)=prec_sms(i)
209 diag_sms3(3,i)=prec_sms(i)
214 DO n=nodft1_sms,nodlt1_sms
216 IF(prec_sms(i)==zero)
THEN
223 prec_sms(i)=one/prec_sms(i)
229 IF(nrbe2+r2size+nrbe3/=0)
THEN
230 IF (nrbe2>0.OR.r2size>0)
THEN
236 1 irbe2 ,lrbe2 ,diag_sms,ms ,diag_sms3,
237 1 skew ,weight ,iad_rbe2,fr_rbe2m ,nmrbe2)
249 1 irbe3 ,lrbe3 ,x ,diag_sms ,diag_sms3,
250 2 frbe3 ,skew ,weight ,iad_rbe3m,fr_rbe3m ,
251 3 fr_rbe3mp,rrbe3 ,rrbe3_pon ,r3size)
257 DO n=nodft1_sms,nodlt1_sms
259 IF(diag_sms3(1,i)==zero)
THEN
262 prec_sms3(1,i)=one/diag_sms3(1,i)
264 IF(diag_sms3(2,i)==zero)
THEN
267 prec_sms3(2,i)=one/diag_sms3(2,i)
269 IF(diag_sms3(3,i)==zero)
THEN
272 prec_sms3(3,i)=one/diag_sms3(3,i)
280 IF(nrlink+nlink+njoint+nadmesh > 0)
THEN
286 1 ms ,r ,ilink ,llink,skew,
287 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
291 1 ms ,r ,nnlink,lnlink,skew ,
292 2 fr_ll ,weight,fnl6 ,x ,xframe,
293 3 v ,idown ,tag_lnk_sms,itab,fnl)
297 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
311 IF (m_vs_sms > 0 )
THEN
312 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
313 IF(imonm>0.AND.itask==0)
CALL startime(timers,70)
316 1 iadk ,jdik ,diag_sms,lt_k ,itask ,
317 2 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
318 3 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
319 4 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
320 5 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
321 6 mv6 ,mw6 ,ms ,nodft ,nodlt ,
327 1 iadk ,jdik ,diag_sms,lt_k ,itask ,
328 2 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
329 3 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
330 4 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
331 5 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
332 6 mv6 ,mw6 ,ms ,nodft ,nodlt )
336 CALL sms_inix(timers,nodft,nodlt,numnod,x_sms,r ,weight,itask ,
339 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,70)
340 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
344 DO n=nodft1_sms,nodlt1_sms
347 x_sms(1,i) = r(1,i)*prec_sms(i)
348 x_sms(2,i) = r(2,i)*prec_sms(i)
349 x_sms(3,i) = r(3,i)*prec_sms(i)
360 CALL sms_rbe3t2(irbe3 ,lrbe3 ,x ,x_sms ,frbe3 ,
361 2 skew ,r ,prec_sms3 )
373 1 irbe2 ,lrbe2 ,r ,x_sms ,prec_sms3 ,
374 1 skew ,weight ,iad_rbe2 ,fr_rbe2m,nmrbe2)
381 IF(nrlink+nlink+njoint+nadmesh > 0)
THEN
387 1 ms ,x_sms ,ilink ,llink,skew,
388 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
392 1 ms ,x_sms ,nnlink,lnlink,skew ,
393 2 fr_ll ,weight,fnl6 ,x ,xframe,
394 3 v ,idown ,tag_lnk_sms,itab,fnl)
398 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
413 2 nprw ,ms ,fsav(1,ninter+1),fr_wall ,fopt ,
414 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
415 4 x_sms ,rbid ,rbid ,rbid ,wfext )
422 2 nprw ,ms ,fsav(1,ninter+1),fr_wall ,fopt ,
423 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
424 4 x_sms ,rbid ,rbid ,rbid ,wfext )
429 y_sms(1:3,nodft:nodlt)=zero
430 z_sms(1:3,nodft:nodlt)=zero
441 DO n=nodft1_sms,nodlt1_sms
446 x_sms(1,i)=x_sms(1,msr)
447 x_sms(2,i)=x_sms(2,msr)
448 x_sms(3,i)=x_sms(3,msr)
462 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
464 1 nodft ,nodlt ,numnod ,iadk ,jdik ,
465 2 itask ,diag_sms,lt_k ,x_sms ,z_sms ,
466 3 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
467 4 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
468 5 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
469 6 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
470 7 mv6 ,mw6 ,nodft2_sms,nodlt2_sms,indx2_sms,
473 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
492 . sh3tree ,nodnx_sms)
501 IF (nrbe2>0.OR.r2size>0)
THEN
508 1 irbe2 ,lrbe2 ,x_sms ,z_sms ,ms ,
509 1 skew ,weight ,iad_rbe2,fr_rbe2m,nmrbe2)
512 1 irbe2 ,lrbe2 ,x ,z_sms ,am ,
513 1 ms ,in ,skew ,weight ,iad_rbe2,
528 1 irbe3 ,lrbe3 ,x ,z_sms ,frbe3 ,
530 3 rrbe3 ,rrbe3_pon ,r3size)
549 IF(tagmsr_rby_sms(msr) /= 0)
THEN
550 rby6(1,1,m)=z_sms(1,msr)*weight(msr)
551 rby6(2,1,m)=z_sms(2,msr)*weight(msr)
552 rby6(3,1,m)=z_sms(3,msr)*weight(msr)
563 IF(weight(i) /= 0)
THEN
564 rby6(1,1,m)=rby6(1,1,m)+z_sms(1,i)
565 rby6(2,1,m)=rby6(2,1,m)+z_sms(2,i)
566 rby6(3,1,m)=rby6(3,1,m)+z_sms(3,i)
576 1 nrbdim,iad_rby,fr_rby6,iad_rby(nspmd+1),rby6)
584 IF(tagmsr_rby_sms(msr) /= 0)
THEN
585 z_sms(1,msr)=rby6(1,1,m)
586 z_sms(2,msr)=rby6(2,1,m)
587 z_sms(3,msr)=rby6(3,1,m)
593 CALL sms_bcs(nodft1_sms,nodlt1_sms,indx1_sms,icodt ,iskew ,
594 2 skew ,z_sms ,nodlt1_sms )
598 IF (nbcscyc>0)
CALL sms_bcscyc(ibcscyc,lbcscyc,skew,x,z_sms)
602 IF(nrlink+nlink+njoint > 0)
THEN
608 1 ms ,z_sms ,ilink ,llink,skew,
609 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
613 1 ms ,z_sms ,nnlink,lnlink,skew ,
614 2 fr_ll ,weight,fnl6 ,x ,xframe,
615 3 v ,idown ,tag_lnk_sms,itab,fnl)
619 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
624 DO n=nodft1_sms,nodlt1_sms
626 res_sms(1,i) = r(1,i)-z_sms(1,i)
627 res_sms(2,i) = r(2,i)-z_sms(2,i)
628 res_sms(3,i) = r(3,i)-z_sms(3,i)
635 DO n=nodft1_sms,nodlt1_sms
655 2 vel ,diag_sms,x ,skew ,sensor_tab,
656 3 weight ,d ,iframe ,xframe ,nsensor ,
657 4 it+1 ,diag_sms,nodnx_sms,cptreac,nodreac,
658 5 fthreac,am ,vr ,dr ,in ,
672 2 nprw ,ms ,fsav(1,ninter+1),fr_wall ,fopt ,
673 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
674 4 rbid ,res_sms,rbid ,rbid ,wfext )
680 DO n=nodft1_sms,nodlt1_sms
682 z_sms(1,i) = res_sms(1,i) *prec_sms(i)
683 z_sms(2,i) = res_sms(2,i) *prec_sms(i)
684 z_sms(3,i) = res_sms(3,i) *prec_sms(i)
694 CALL sms_rbe3t2(irbe3 ,lrbe3 ,x ,z_sms ,frbe3 ,
695 2 skew ,res_sms ,prec_sms3 )
707 1 irbe2 ,lrbe2 ,res_sms,z_sms ,prec_sms3,
708 1 skew ,weight ,iad_rbe2 ,fr_rbe2m,nmrbe2)
715 IF(nrlink+nlink+njoint+nadmesh > 0)
THEN
721 1 ms ,z_sms ,ilink ,llink,skew,
722 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
726 1 ms ,z_sms ,nnlink,lnlink,skew ,
727 2 fr_ll ,weight,fnl6 ,x ,xframe,
728 3 v ,idown ,tag_lnk_sms,itab,fnl)
732 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
744 DO n=nodft1_sms,nodlt1_sms,mvsiz
746 llt=
min(nodlt1_sms-n+1,mvsiz)
750 p_sms(1,i) = z_sms(1,i)
751 p_sms(2,i) = z_sms(2,i)
752 p_sms(3,i) = z_sms(3,i)
753 g(l) = ( z_sms(1,i)*res_sms(1,i)
754 . + z_sms(2,i)*res_sms(2,i)
755 . + z_sms(3,i)*res_sms(3,i))
759 r2(l) = ( res_sms(1,i)*res_sms(1,i)
760 . + res_sms(2,i)*res_sms(2,i)
761 . + res_sms(3,i)*res_sms(3,i))
773 res0_sms=res0_sms+r02t
775#include "lockoff.inc"
781 IF(imonm>0.AND.itask==0)
CALL startime(timers,62)
784 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,62)
787 r6sms(k)=r6sms(k)+r6t(k)
788 g6sms(k)=g6sms(k)+g6t(k)
790#include "lockoff.inc"
798 IF(iparit/=0.AND.itask==0)
THEN
799 res0_sms=r6sms(1)+r6sms(2)+r6sms(3)+
800 . r6sms(4)+r6sms(5)+r6sms(6)
801 g0_sms =g6sms(1)+g6sms(2)+g6sms(3)+
802 . g6sms(4)+g6sms(5)+g6sms(6)
806 IF(imonm>0)
CALL startime(timers,63)
813 IF(imonm>0)
CALL stoptime(timers,63)
815 IF(imonm>0)
CALL startime(timers,63)
821 rbuf(1) = dbuf(1)+dbuf(2)+dbuf(3)+
822 . dbuf(4)+dbuf(5)+dbuf(6)
823 rbuf(2) = dbuf(7) +dbuf(8) +dbuf(9)+
824 . dbuf(10)+dbuf(11)+dbuf(12)
828 IF(imonm>0)
CALL stoptime(timers,63)
838 DO n=nodft1_sms,nodlt1_sms
843 p_sms(1,i)=p_sms(1,msr)
844 p_sms(2,i)=p_sms(2,msr)
845 p_sms(3,i)=p_sms(3,msr)
856 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
857 IF (res0_sms<em10)
GOTO 200
858 toln=res0_sms*tol_sms
867 IF (m_vs_sms > 0 )
THEN
868 IF(imonm>0.AND.itask==0)
CALL startime(timers,70)
870 CALL sms_pro_p(timers,nodft ,nodlt ,numnod ,p_sms,weight,itask ,
877 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,70)
883 1 nodft ,nodlt ,numnod ,iadk ,jdik ,
884 2 itask ,diag_sms,lt_k ,p_sms ,y_sms ,
885 3 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
886 4 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
887 5 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
888 6 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
889 7 mv6 ,mw6 ,nodft2_sms,nodlt2_sms,indx2_sms,
892 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
915 . sh3tree ,nodnx_sms)
924 IF (nrbe2>0.OR.r2size>0)
THEN
931 1 irbe2 ,lrbe2 ,p_sms ,y_sms ,ms ,
932 1 skew ,weight ,iad_rbe2,fr_rbe2m,nmrbe2)
935 1 irbe2 ,lrbe2 ,x ,y_sms ,am ,
936 1 ms ,in ,skew ,weight ,iad_rbe2,
951 1 irbe3 ,lrbe3 ,x ,y_sms ,frbe3 ,
952 2 skew ,weight ,iad_rbe3m,fr_rbe3m,fr_rbe3mp,
953 3 rrbe3 ,rrbe3_pon ,r3size)
974 IF(tagmsr_rby_sms(msr) /= 0)
THEN
975 rby6(1,1,m)=y_sms(1,msr)*weight(msr)
976 rby6(2,1,m)=y_sms(2,msr)*weight(msr)
977 rby6(3,1,m)=y_sms(3,msr)*weight(msr)
988 IF(weight(i) /= 0)
THEN
989 rby6(1,1,m)=rby6(1,1,m)+y_sms(1,i)
990 rby6(2,1,m)=rby6(2,1,m)+y_sms(2,i)
991 rby6(3,1,m)=rby6(3,1,m
1004 1 nrbdim,iad_rby,fr_rby6,iad_rby(nspmd+1),rby6)
1013 IF(tagmsr_rby_sms(msr) /= 0)
THEN
1014 y_sms(1,msr)=rby6(1,1,m)
1015 y_sms(2,msr)=rby6(2,1,m)
1016 y_sms(3,msr)=rby6(3,1,m)
1023 CALL sms_bcs(nodft1_sms,nodlt1_sms,indx1_sms,icodt ,iskew ,
1024 2 skew ,y_sms ,nodlt1_sms )
1026 IF (nbcscyc>0)
CALL sms_bcscyc(ibcscyc,lbcscyc,skew,x,y_sms)
1030 IF(nrlink+nlink+njoint > 0)
THEN
1036 1 ms ,y_sms ,ilink ,llink,skew,
1037 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
1041 1 ms ,y_sms ,nnlink,lnlink,skew ,
1042 2 fr_ll ,weight,fnl6 ,x ,xframe,
1043 3 v ,idown ,tag_lnk_sms,itab,fnl)
1046 .
CALL sms_cjoint_1(y_sms ,diag_sms,ljoint,iadcj,fr_cj,
1047 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
1057 2 nprw ,ms ,fsav(1,ninter+1),fr_wall ,fopt ,
1058 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
1059 4 rbid ,y_sms ,rbid ,rbid ,wfext )
1065 DO n=nodft1_sms,nodlt1_sms,mvsiz
1067 llt=
min(nodlt1_sms-n+1,mvsiz)
1071 s(l) = (p_sms(1,i)*y_sms(1,i)
1072 . + p_sms(2,i)*y_sms(2,i)
1073 . + p_sms(3,i)*y_sms(3,i))*weight(i)
1081#include "lockon.inc"
1083#include "lockoff.inc"
1088 IF(imonm>0.AND.itask==0)
CALL startime(timers,62)
1090 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,62)
1091#include "lockon.inc"
1093 s6sms(k)=s6sms(k)+s6t(k)
1095#include "lockoff.inc"
1103 IF(iparit/=0.AND.itask==0)
THEN
1104 s_sms=s6sms(1)+s6sms(2)+s6sms(3)+
1105 . s6sms(4)+s6sms(5)+s6sms(6)
1107 ELSEIF(itask==0)
THEN
1109 IF(imonm>0.AND.itask==0)
CALL startime(timers,63)
1112 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,63)
1114 IF(imonm>0.AND.itask==0)
CALL startime(timers,63)
1119 s_sms = dbuf(1)+dbuf(2)+dbuf(3)+
1120 . dbuf(4)+dbuf(5)+dbuf(6)
1122 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,63)
1131 DO n=nodft1_sms,nodlt1_sms
1133 x_sms(1,i) = x_sms(1,i) +
alpha*p_sms(1,i)
1134 x_sms(2,i) = x_sms(2,i) +
alpha*p_sms(2,i)
1135 x_sms(3,i) = x_sms(3,i) +
alpha*p_sms(3,i)
1136 res_sms(1,i) = res_sms(1,i) -
alpha*y_sms(1,i)
1137 res_sms(2,i) = res_sms(2,i) -
alpha*y_sms(2,i)
1138 res_sms(3,i) = res_sms(3,i) -
alpha*y_sms(3,i)
1146 .
CALL sms_fixvel(ibfv ,res_sms ,v ,npc ,tf ,
1147 2 vel ,diag_sms,x ,skew ,sensor_tab,
1148 3 weight ,d ,iframe,xframe ,nsensor ,
1149 4 it+1 ,diag_sms,nodnx_sms,cptreac,nodreac,
1150 5 fthreac,am ,vr ,dr ,in ,
1157 DO n=nodft1_sms,nodlt1_sms
1159 z_sms(1,i) = res_sms(1,i) *prec_sms(i)
1160 z_sms(2,i) = res_sms(2,i) *prec_sms(i)
1161 z_sms(3,i) = res_sms(3,i) *prec_sms(i)
1171 CALL sms_rbe3t2(irbe3 ,lrbe3 ,x ,z_sms ,frbe3 ,
1172 2 skew ,res_sms ,prec_sms3 )
1184 1 irbe2 ,lrbe2 ,res_sms,z_sms ,prec_sms3,
1185 1 skew ,weight ,iad_rbe2 ,fr_rbe2m,nmrbe2)
1192 IF(nrlink+nlink+njoint+nadmesh > 0)
THEN
1198 1 ms ,z_sms ,ilink ,llink,skew,
1199 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
1203 1 ms ,z_sms ,nnlink,lnlink,skew ,
1204 2 fr_ll ,weight,fnl6 ,x ,xframe,
1205 3 v ,idown ,tag_lnk_sms,itab,fnl)
1208 .
CALL sms_cjoint_1(z_sms ,diag_sms,ljoint,iadcj,fr_cj,
1209 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
1220 DO n=nodft1_sms,nodlt1_sms,mvsiz
1222 llt=
min(nodlt1_sms-n+1,mvsiz)
1226 r2(l) = ( res_sms(1,i)*res_sms(1,i)
1227 . + res_sms(2,i)*res_sms(2,i)
1228 . + res_sms(3,i)*res_sms(3,i))
1230 g(l) = ( z_sms(1,i)*res_sms(1,i)
1231 . + z_sms(2,i)*res_sms(2,i)
1232 . + z_sms(3,i)*res_sms(3,i))
1243#include
"lockon.inc"
1244 res1_sms= res1_sms+ r2t
1245 g1_sms = g1_sms + g1t
1246#include "lockoff.inc"
1252 IF(imonm>0.AND.itask==0)
CALL startime(timers,62)
1255 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,62)
1256#include "lockon.inc"
1258 r6sms(k)=r6sms(k)+r6t(k)
1259 g6sms(k)=g6sms(k)+g6t(k)
1261#include "lockoff.inc"
1269 IF(iparit/=0.AND.itask==0)
THEN
1270 res1_sms=r6sms(1)+r6sms(2)+r6sms(3)+
1271 . r6sms(4)+r6sms(5)+r6sms(6)
1272 g1_sms =g6sms(1)+g6sms(2)+g6sms(3)+
1273 . g6sms(4)+g6sms(5)+g6sms(6)
1275 ELSEIF(itask==0)
THEN
1277 IF(imonm>0)
CALL startime(timers,63)
1284 IF(imonm>0)
CALL stoptime(timers,63)
1286 IF(imonm>0)
CALL startime(timers,63)
1292 rbuf(1) = dbuf(1)+dbuf(2)+dbuf(3)+
1293 . dbuf(4)+dbuf(5)+dbuf(6)
1294 rbuf(2) = dbuf(7) +dbuf(8) +dbuf(9)+
1295 . dbuf(10)+dbuf(11)+dbuf(12)
1299 IF(imonm>0)
CALL stoptime(timers,63)
1307 if(itask==0.and.ispmd==0
1308 . .and.(ncprisms < 0 .and.
1309 . mod(ncycle,ncpria)==0))
then
1310 write(iout,1002) ncycle,totit,res1_sms,toln
1314 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
1315 IF(it>=nlim.OR.res1_sms<=toln)
GO TO 200
1316 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
1318 beta=g1_sms/
max(em30,g0_sms)
1326 DO n=nodft1_sms,nodlt1_sms
1328 p_sms(1,i) = z_sms(1,i) + beta*p_sms(1,i)
1329 p_sms(2,i) = z_sms(2,i) + beta*p_sms(2,i)
1330 p_sms(3,i) = z_sms(3,i) + beta*p_sms(3,i)
1339 DO n=nodft1_sms,nodlt1_sms
1344 p_sms(1,i)=p_sms(1,msr)
1345 p_sms(2,i)=p_sms(2,msr)
1346 p_sms(3,i)=p_sms(3,msr)
1357 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
1365 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
1368 IF(ispmd==0.AND.itask==0)
THEN
1369#include "lockon.inc"
1371 .
' ** ERROR : AMS IS LIKELY DIVERGING '
1372 WRITE(iout,1100) nlim,ncycle
1373#include "lockoff.inc"
1380 CALL sms_check(timers, nodft ,nodlt ,iadk ,jdik ,diag_sms,
1381 2 lt_k ,jadi_sms ,jdii_sms ,lti_sms ,itask ,
1382 3 itab ,iad_elem ,fr_elem ,fr_sms ,fr_rms ,
1383 4 list_sms,list_rms,ams_work)
1396 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
1398 1 nodft ,nodlt ,numnod ,iadk ,jdik ,
1399 2 itask ,diag_sms,lt_k ,x_sms ,z_sms ,
1400 3 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
1401 4 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
1402 5 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
1403 6 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
1404 7 mv6 ,mw6 ,nodft2_sms,nodlt2_sms,indx2_sms,
1407 IF(imonm>0.AND.itask==0)
CALL startime(timers,61)
1414 . sh3tree ,nodnx_sms)
1423 IF (nrbe2>0.OR.r2size>0)
THEN
1430 1 irbe2 ,lrbe2 ,x_sms ,z_sms ,ms ,
1431 1 skew ,weight ,iad_rbe2,fr_rbe2m,nmrbe2)
1434 1 irbe2 ,lrbe2 ,x ,z_sms ,am ,
1435 1 ms ,in ,skew ,weight ,iad_rbe2,
1450 1 irbe3 ,lrbe3 ,x ,z_sms ,frbe3 ,
1451 2 skew ,weight ,iad_rbe3m,fr_rbe3m,fr_rbe3mp,
1452 3 rrbe3 ,rrbe3_pon ,r3size)
1471 IF(tagmsr_rby_sms(msr) /= 0)
THEN
1472 rby6(1,1,m)=z_sms(1,msr)*weight(msr)
1473 rby6(2,1,m)=z_sms(2,msr)*weight(msr)
1474 rby6(3,1,m)=z_sms(3,msr)*weight(msr)
1485 IF(weight(i) /= 0)
THEN
1486 rby6(1,1,m)=rby6(1,1,m)+z_sms(1,i)
1487 rby6(2,1,m)=rby6(2,1,m)+z_sms(2,i)
1488 rby6(3,1,m)=rby6(3,1,m)+z_sms(3,i)
1498 1 nrbdim,iad_rby,fr_rby6,iad_rby(nspmd+1),rby6)
1506 IF(tagmsr_rby_sms(msr) /= 0)
THEN
1507 z_sms(1,msr)=rby6(1,1,m)
1508 z_sms(2,msr)=rby6(2,1,m)
1509 z_sms(3,msr)=rby6(3,1,m)
1517 CALL sms_bcs(nodft1_sms,nodlt1_sms,indx1_sms,icodt ,iskew ,
1518 2 skew ,z_sms ,nodlt1_sms )
1522 IF (nbcscyc>0)
CALL sms_bcscyc(ibcscyc,lbcscyc,skew,x,z_sms)
1526 IF(nrlink+nlink+njoint > 0)
THEN
1532 1 ms ,z_sms ,ilink ,llink,skew,
1533 2 fr_rl ,weight,frl6 ,idown,tag_lnk_sms,
1537 1 ms ,z_sms ,nnlink,lnlink,skew ,
1538 2 fr_ll ,weight,fnl6 ,x ,xframe,
1539 3 v ,idown ,tag_lnk_sms,itab,fnl)
1542 .
CALL sms_cjoint_1(z_sms ,diag_sms,ljoint,iadcj,fr_cj,
1543 . cjwork,idown ,tag_lnk_sms(nrlink+nlink+1),itask)
1548 IF(ifricw/=0.AND.iact==0)
THEN
1552 DO n=nodft1_sms,nodlt1_sms
1555 res_sms(1,i) = r(1,i)-z_sms(1,i)
1556 res_sms(2,i) = r(2,i)-z_sms(2,i)
1557 res_sms(3,i) = r(3,i)-z_sms(3,i)
1564 DO n=nodft1_sms,nodlt1_sms
1581 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
1582 4 x_sms ,res_sms,r ,frea ,wfext)
1587 DO n=nodft1_sms,nodlt1_sms
1591 frea(1,i) = frea(1,i)+r(1,i)-z_sms(1,i)
1592 frea(2,i) = frea(2,i)+r(2,i)-z_sms(2,i)
1593 frea(3,i) = frea(3,i)+r(3,i)-z_sms(3,i)
1603 DO n=nodft1_sms,nodlt1_sms
1619 2 nprw ,ms ,fsav(1,ninter+1),fr_wall ,fopt ,
1620 3 rwsav ,weight ,irwl_work ,nrwl_sms,frwl6,
1621 4 x_sms ,res_sms,r ,frea ,wfext)
1630 DO n=nodft1_sms,nodlt1_sms
1636 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,61)
1638 IF (m_vs_sms > 0 .AND. it > 0)
THEN
1639 IF(imonm>0.AND.itask==0)
CALL startime(timers,70)
1641 1 iadk ,jdik ,diag_sms,lt_k ,itask ,
1642 2 nodft1_sms,nodlt1_sms,indx1_sms,nodnx_sms,iad_elem ,
1643 3 fr_elem ,weight ,jadi_sms ,jdii_sms ,lti_sms ,
1644 4 iskyi_sms ,mskyi_sms ,fr_sms ,fr_rms ,list_sms ,
1645 5 list_rms ,mskyi_fi_sms ,vfi ,imv ,mv ,
1646 6 mv6 ,mw6 ,ms ,x_sms ,p_sms ,
1647 7 y_sms ,nodft ,nodlt ,kinet )
1651 IF (itask == 0) ncg_run_sms = ncg_run_sms + 1
1652 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,70)
1656 if(itask==0.and.ispmd==0
1657 . .and.(ncprisms/=0.and.mod(ncycle,ncpria)==0))
then
1659 write(iout,1000) ncycle,totit
1661 write(iout,1001) ncycle,totit,res1_sms,toln
1666 1000
FORMAT(3x,
'CYCLE NUMBER',i5,
1667 .
' TOTAL C.G. ITERATION NUMBER=',i5)
1668 1001
FORMAT(3x,
'CYCLE NUMBER',i5,
1669 .
' TOTAL C.G. ITERATION NUMBER=',i5,
1670 .
' RELATIVE RESIDUAL NORM=',e11.4,
1671 .
' REFERENCE RESIDUAL NORM',e11.4)
1672 1002
FORMAT(3x,
'CYCLE NUMBER',i5,
1673 .
' ITERATION NUMBER=',i5,
1674 .
' RELATIVE RESIDUAL NORM=',e11.4,
1675 .
' REFERENCE RESIDUAL NORM',e11.4)
1677 .
' ** ERROR : AMS IS LIKELY DIVERGING:',/,
1678 .
' TOTAL C.G. ITERATION NUMBER = ',i8,
' AT CYCLE NUMBER ',i8)
1701 2 ITASK ,DIAG_K ,LT_K ,V ,W ,
1702 3 NODFT1_SMS,NODLT1_SMS,INDX1_SMS,NODNX_SMS,IAD_ELEM ,
1703 4 FR_ELEM ,WEIGHT ,JADI_SMS ,JDII_SMS ,LTI_SMS ,
1704 5 ISKYI_SMS ,MSKYI_SMS ,FR_SMS ,FR_RMS ,LIST_SMS ,
1705 6 LIST_RMS ,MSKYI_FI_SMS,VFI ,IMV ,MV ,
1706 7 MV6 ,MW6 ,NODFT2_SMS,NODLT2_SMS,INDX2_SMS,
1716#include "implicit_f.inc"
1720#include "com01_c.inc"
1721#include "parit_c.inc"
1723#include "task_c.inc"
1724#include "timeri_c.inc"
1725#include "warn_c.inc"
1729 TYPE(timer_) ,
INTENT(INOUT) :: timers
1730 INTEGER nodft, nodlt, itask, numnod, iadl(*) ,JDIL(*),
1731 . NODFT1_SMS,NODLT1_SMS,INDX1_SMS(*), NODNX_SMS(*),
1732 . nodft2_sms,nodlt2_sms,indx2_sms(*), nodii_sms(*),
1733 . iad_elem(2,nspmd+1) ,fr_elem(*),weight(*),
1734 . jadi_sms(*),jdii_sms(*),
1735 . iskyi_sms(lskyi_sms,*),fr_sms(nspmd+1),fr_rms(nspmd+1),
1736 . list_sms(*), list_rms(*), imv(*)
1739 . diag_k(*), w(*), lt_k(*) ,v(*), lti_sms(*), mskyi_sms(*),
1740 . mskyi_fi_sms(*), vfi(*), mv(*)
1741 DOUBLE PRECISION MV6(6,3,*), MW6(6,3,*)
1745 INTEGER I,J,K,I3,I2,I1,K3,K2,K1,N, LOC_PROC, M, KK,
1746 . KMV,KMV3,KMV2,KMV1
1747 INTEGER SIZE, LENR, L,
1748 . IAD_SEND(NSPMD+1),IAD_RECV(NSPMD+1),
1749 . REQ_R(NSPMD),REQ_S(NSPMD)
1752 my_real,
DIMENSION(:),
ALLOCATABLE :: RBUF
1753 my_real,
DIMENSION(:),
ALLOCATABLE :: SBUF
1756 CALL my_alloc(rbuf,3*(fr_rms(nspmd+1)+fr_sms(nspmd+1)))
1757 CALL my_alloc(sbuf,3*(fr_rms(nspmd+1)+fr_sms(nspmd+1)))
1762 IF(idtmins==2.OR.idtmins_int/=0)
THEN
1771 IF(imonm>0)
CALL startime(timers,65)
1773 . fr_sms,list_rms,list_sms,1,
1774 . iad_send,iad_recv,req_r,req_s,rbuf,sbuf)
1775 IF(imonm>0)
CALL stoptime(timers,65)
1781 IF(imonm>0.AND.itask==0)
CALL startime(timers,64)
1782 IF(imonm>0.AND.itask==0)
CALL startime(timers,74)
1785 IF(iparit==0.OR.debug(9)==0)
THEN
1787 DO n=nodft1_sms,nodlt1_sms
1792 w(i3)=diag_k(i)*v(i3)*weight(i)
1793 w(i2)=diag_k(i)*v(i2)*weight(i)
1794 w(i1)=diag_k(i)*v(i1)*weight(i)
1798 DO n=nodft1_sms,nodlt1_sms
1803 DO j =iadl(i),iadl(i+1)-1
1809 w(i3) = w(i3) + l_k*v(k3)
1810 w(i2) = w(i2) + l_k*v(k2)
1811 w(i1) = w(i1) + l_k*v(k1)
1823 DO n=nodft1_sms,nodlt1_sms
1834 DO n=nodft1_sms,nodlt1_sms
1844 mv(kmv3)=diag_k(i)*v(i3)*weight(i)
1845 mv(kmv2)=diag_k(i)*v(i2)*weight(i)
1846 mv(kmv1)=diag_k(i)*v(i1)*weight(i)
1847 DO j =iadl(i),iadl(i+1)-1
1869 IF(imonm>0)
CALL stoptime(timers,74)
1872 IF(idtmins==2.OR.idtmins_int/=0)
THEN
1875 DO n=nodft2_sms,nodlt2_sms
1880 DO j =jadi_sms(i),jadi_sms(i+1)-1
1886 w(i3) = w(i3) +l_k*v(k3)
1887 w(i2) = w(i2) +l_k*v(k2)
1888 w(i1) = w(i1) +l_k*v(k1)
1899 IF(imonm>0)
CALL stoptime(timers,64)
1902 IF(imonm>0)
CALL startime(timers,65)
1904 . fr_sms,list_rms,list_sms,2,
1905 . iad_send,iad_recv,req_r,req_s,rbuf,sbuf)
1906 IF(imonm>0)
CALL stoptime(timers,65)
1916 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,64)
1919 IF(imonm>0.AND.itask==0)
CALL startime(timers,64)
1929 DO k=fr_rms(l),fr_rms(l+1)-1
1939 w(i3) = w(i3) -mskyi_fi_sms(k)*vfi(k3)
1940 w(i2) = w(i2) -mskyi_fi_sms(k)*vfi(k2)
1941 w(i1) = w(i1) -mskyi_fi_sms(k)*vfi(k1)
1945 DO k=fr_sms(l),fr_sms(l+1)-1
1956 w(i3) = w(i3) -mskyi_sms(k)*vfi(k3)
1957 w(i2) = w(i2) -mskyi_sms(k)*vfi(k2)
1958 w(i1) = w(i1) -mskyi_sms(k)*vfi(k1)
1968 IF(imonm>0)
CALL stoptime(timers,64)
1971 lenr = iad_elem(1,nspmd+1)-iad_elem(1,1)
1972 IF(imonm>0)
CALL startime(timers,80)
1975 IF(imonm>0)
CALL stoptime(timers,80)
1986 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,64)
1990 ELSEIF(debug(9)==0)
THEN
1994 DO n=nodft2_sms,nodlt2_sms
1996 DO j =jadi_sms(i),jadi_sms(i+1)-1
2023 DO k=fr_rms(l),fr_rms(l+1)-1
2026 IF(i == 0 .OR. nodii_sms(i) < nodft2_sms .OR.
2027 . nodlt2_sms < nodii_sms(i))cycle
2036 mv(kmv3) = -mskyi_fi_sms(k)*vfi(k3)
2037 mv(kmv2) = -mskyi_fi_sms(k)*vfi(k2)
2038 mv(kmv1) = -mskyi_fi_sms(k)*vfi(k1)
2042 DO k=fr_sms(l),fr_sms(l+1)-1
2046 IF(i == 0 .OR. nodii_sms(i) < nodft2_sms .OR.
2047 . nodlt2_sms < nodii_sms(i))cycle
2056 mv(kmv3) = -mskyi_sms(k)*vfi(k3)
2057 mv(kmv2) = -mskyi_sms(k)*vfi(k2)
2058 mv(kmv1) = -mskyi_sms(k)*vfi(k1)
2068 DO n=nodft2_sms,nodlt2_sms
2080 mw6(j,1,i) = mw6(j,1,i)+mv6(j,1,k)
2081 mw6(j,2,i) = mw6(j,2,i)+mv6(j,2,k)
2082 mw6(j,3,i) = mw6(j,3,i)+mv6(j,3,k)
2086 DO n=nodft2_sms,nodlt2_sms
2092 . +mw6(1,3,i)+mw6(2,3,i)+mw6(3,3,i)
2093 . +mw6(4,3,i)+mw6(5,3,i)+mw6(6,3,i)
2095 . +mw6(1,2,i)+mw6(2,2,i)+mw6(3,2,i)
2096 . +mw6(4,2,i)+mw6(5,2,i)+mw6(6,2,i)
2098 . +mw6(1,1,i)+mw6(2,1,i)+mw6(3,1,i)
2099 . +mw6(4,1,i)+mw6(5,1,i)+mw6(6,1,i)
2107 IF(imonm>0)
CALL stoptime(timers,64)
2110 lenr = iad_elem(1,nspmd+1)-iad_elem(1,1)
2111 IF(imonm>0)
CALL startime(timers,80)
2114 IF(imonm>0)
CALL stoptime(timers,80)
2125 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,64)
2133 DO n=nodft1_sms,nodlt1_sms
2135 DO j =jadi_sms(i),jadi_sms(i+1)-1
2162 DO k=fr_rms(l),fr_rms(l+1)-1
2165 IF(i == 0 .OR. nodnx_sms(i) < nodft1_sms .OR.
2166 . nodlt1_sms < nodnx_sms(i))cycle
2175 mv(kmv3) = -mskyi_fi_sms(k)*vfi(k3)
2176 mv(kmv2) = -mskyi_fi_sms(k)*vfi(k2)
2177 mv(kmv1) = -mskyi_fi_sms(k)*vfi(k1)
2181 DO k=fr_sms(l),fr_sms(l+1)-1
2185 IF(i == 0 .OR. nodnx_sms(i) < nodft1_sms .OR.
2186 . nodlt1_sms < nodnx_sms(i))cycle
2195 mv(kmv3) = -mskyi_sms(k)*vfi(k3)
2196 mv(kmv2) = -mskyi_sms(k)*vfi(k2)
2197 mv(kmv1) = -mskyi_sms(k)*vfi(k1)
2207 DO n=nodft1_sms,nodlt1_sms
2219 mw6(j,1,i) = mw6(j,1,i)+mv6(j,1,k)
2220 mw6(j,2,i) = mw6(j,2,i)+mv6(j,2,k)
2221 mw6(j,3,i) = mw6(j,3,i)+mv6(j,3,k)
2230 IF(imonm>0)
CALL stoptime(timers,64)
2233 lenr = iad_elem(1,nspmd+1)-iad_elem(1,1)
2234 IF(imonm>0)
CALL startime(timers,80)
2237 IF(imonm>0)
CALL stoptime(timers,80)
2244 IF(imonm>0.AND.itask==0)
CALL startime(timers,64)
2246 DO n=nodft1_sms,nodlt1_sms
2251 w(i3) = mw6(1,3,i)+mw6(2,3,i)+mw6(3,3,i)
2252 . +mw6(4,3,i)+mw6(5,3,i)+mw6(6,3,i)
2253 w(i2) = mw6(1,2,i)+mw6(2,2,i)+mw6(3,2,i)
2254 . +mw6(4,2,i)+mw6(5,2,i)+mw6(6,2,i)
2255 w(i1) = mw6(1,1,i)+mw6(2,1,i)+mw6(3,1,i)
2256 . +mw6(4,1,i)+mw6(5,1,i)+mw6(6,1,i)
2262 IF(imonm>0.AND.itask==0)
CALL stoptime(timers,64)
2271 IF(imonm>0)
CALL stoptime(timers,64)
2275 lenr = iad_elem(1,nspmd+1)-iad_elem(1,1)
2276 IF(imonm>0)
CALL startime(timers,65)
2279 IF(imonm>0)
CALL stoptime(timers,65)