37
38
39
41
42
43
44#include "implicit_f.inc"
45
46
47
48#include "com01_c.inc"
49
50#include "com08_c.inc"
51#include "parit_c.inc"
52#include "task_c.inc"
53#include "intstamp_c.inc"
54
55
56
57 INTEGER WEIGHT(*)
58 my_real ms(*), in(*), a(3,*), ar(3,*), stifn(*), stifr(*)
59 TYPE(INTSTAMP_DATA) INTSTAMP(*)
60 DOUBLE PRECISION, INTENT(INOUT) :: WFEXT
61
62
63
64 INTEGER NN, MSR, MSRR, INTDAMP, KDIR, K, IROT
65 my_real bufs(8,nintstamp),
alpha, vis, mass, inm, stf, str, vx, vy, vz, fvx, fvy, fvz, dt05, dw
66 DOUBLE PRECISION BUFS6(6,8,NINTSTAMP)
67
68 IF(iparit /= 0)THEN
69 DO nn=1,nintstamp
70 DO k=1,6
71 DO kdir=1,3
72 bufs6(k,kdir,nn)=intstamp(nn)%FC6(k,kdir)
73 END DO
74 bufs6(k,4,nn)=intstamp(nn)%ST6(k)
75 END DO
76
77
78 DO k=1,6
79 DO kdir=1,3
80 bufs6(k,kdir+4,nn)=intstamp(nn)%MC6(k,kdir)
81 END DO
82 bufs6(k,8,nn)=intstamp(nn)%STR6(k)
83 END DO
84 END DO
85 IF(nspmd>1)
87 IF(ispmd==0)THEN
88 DO nn=1,nintstamp
89 DO kdir=1,8
90 bufs(kdir,nn)=bufs6(1,kdir,nn)
91 . +bufs6(2,kdir,nn)
92 . +bufs6(3,kdir,nn)
93 . +bufs6(4,kdir,nn)
94 . +bufs6(5,kdir,nn)
95 . +bufs6(6,kdir,nn)
96 END DO
97 END DO
98 END IF
99 IF(nspmd>1)
101 DO nn=1,nintstamp
102 DO kdir=1,3
103 intstamp(nn)%FC(kdir)=bufs(kdir,nn)
104 END DO
105 intstamp(nn)%STF=bufs(4,nn)
106 irot=intstamp(nn)%IROT
107 IF(irot/=0)THEN
108 DO kdir=1,3
109 intstamp(nn)%MC(kdir)=bufs(kdir+4,nn)
110 END DO
111 intstamp(nn)%STR=bufs(8,nn)
112 END IF
113 END DO
114 ELSE
115 IF(nspmd>1)THEN
116 DO nn=1,nintstamp
117 DO kdir=1,3
118 bufs(kdir,nn)=intstamp(nn)%FC(kdir)
119 END DO
120 bufs(4,nn)=intstamp(nn)%STF
121
122
123 DO kdir=1,3
124 bufs(kdir+4,nn)=intstamp(nn)%MC(kdir)
125 END DO
126 bufs(8,nn)=intstamp(nn)%STR
127 END DO
130 DO nn=1,nintstamp
131 DO kdir=1,3
132 intstamp(nn)%FC(kdir)=bufs(kdir,nn)
133 END DO
134 intstamp(nn)%STF=bufs(4,nn)
135 irot=intstamp(nn)%IROT
136 IF(irot /= 0)THEN
137
138 DO kdir=1,3
139 intstamp(nn)%MC(kdir)=bufs(kdir+4,nn)
140 END DO
141 intstamp(nn)%STR=bufs(8,nn)
142 END IF
143 END DO
144 END IF
145 END IF
146
147
148
149 DO nn=1,nintstamp
150
151 irot=intstamp(nn)%IROT
152 msr =intstamp(nn)%MSR
153 DO kdir=1,3
154 a(kdir,msr)=a(kdir,msr)+intstamp(nn)%FC(kdir)
155 END DO
156 IF(irot/=0)THEN
157 DO kdir=1,3
158 ar(kdir,msr)=ar(kdir,msr)+intstamp(nn)%MC(kdir)
159 END DO
160 END IF
161 END DO
162
163
164
165 dt05=half*dt1
166 DO nn=1,nintstamp
167 msr=intstamp(nn)%MSR
168 intdamp=intstamp(nn)%INTDAMP
169 alpha =intstamp(nn)%DAMP
170 mass =ms(msr)
171 stf =intstamp(nn)%STF
172 vis =
alpha*sqrt(four*mass*stf)
173 wfext=wfext + dt05*intstamp(nn)%DW
174 IF(intdamp==0)THEN
175 a(1,msr)=a(1,msr)-vis*intstamp(nn)%V(1)
176 a(2,msr)=a(2,msr)-vis*intstamp(nn)%V(2)
177 a(3,msr)=a(3,msr)-vis*intstamp(nn)%V(3)
178 IF(ispmd==0)THEN
179 dw=-vis*( intstamp(nn)%V(1)*intstamp(nn)%V(1)
180 . +intstamp(nn)%V(2)*intstamp(nn)%V(2)
181 . +intstamp(nn)%V(3)*intstamp(nn)%V(3))
182 wfext=wfext + dt05 * dw
183 END IF
184 ELSE
185 vx=(intstamp(nn)%V(1)-intstamp(intdamp)%V(1))
186 vy=(intstamp(nn)%V(2)-intstamp(intdamp)%V(2))
187 vz=(intstamp(nn)%V(3)-intstamp(intdamp)%V(3))
188 fvx=vis*vx
189 fvy=vis*vy
190 fvz=vis*vz
191 a(1,msr)=a(1,msr)-fvx
192 a(2,msr)=a(2,msr)-fvy
193 a(3,msr)=a(3,msr)-fvz
194 msrr=intstamp(intdamp)%MSR
195 a(1,msrr)=a(1,msrr)+fvx
196 a(2,msrr)=a(2,msrr)+fvy
197 a(3,msrr)=a(3,msrr)+fvz
198 IF(ispmd==0)THEN
199 dw=-two*(fvx*vx+fvy*vy+fvz*vz)
200 wfext=wfext + dt05 * dw
201 END IF
202 END IF
203 irot=intstamp(nn)%IROT
204 IF(irot/=0)THEN
205 alpha=intstamp(nn)%DAMPR
206 inm=in(msr)
207 str =intstamp(nn)%STR
208 vis =
alpha*sqrt(four*inm*str)
209 IF(intdamp==0)THEN
210 ar(1,msr)=ar(1,msr)-vis*intstamp(nn)%VR(1)
211 ar(2,msr)=ar(2,msr)-vis*intstamp(nn)%VR(2)
212 ar(3,msr)=ar(3,msr)-vis*intstamp(nn)%VR(3)
213 IF(ispmd==0)THEN
214 dw=-vis*( intstamp(nn)%VR(1)*intstamp(nn)%VR(1)
215 . +intstamp(nn)%VR(2)*intstamp(nn)%VR(2)
216 . +intstamp(nn)%VR(3)*intstamp(nn)%VR(3))
217 wfext=wfext + dt05 * dw
218 END IF
219 ELSE
220 vx=intstamp(nn)%VR(1)-intstamp(intdamp)%VR(1)
221 vy=intstamp(nn)%VR(2)-intstamp(intdamp)%VR(2)
222 vz=intstamp(nn)%VR(3)-intstamp(intdamp)%VR(3)
223 fvx=vis*vx
224 fvy=vis*vy
225 fvz=vis*vz
226 ar(1,msr)=ar(1,msr)-fvx
227 ar(2,msr)=ar(2,msr)-fvy
228 ar(3,msr)=ar(3,msr)-fvz
229 msrr=intstamp(intdamp)%MSR
230 ar(1,msrr)=ar(1,msrr)+fvx
231 ar(2,msrr)=ar(2,msrr)+fvy
232 ar(3,msrr)=ar(3,msrr)+fvz
233 IF(ispmd==0)THEN
234 dw=-two*(fvx*vx+fvy*vy+fvz*vz)
235 wfext=wfext + dt05 * dw
236 END IF
237 END IF
238 END IF
239 ENDDO
240
241 RETURN
subroutine spmd_rbcast(tabi, tabr, n1, n2, from, add)
subroutine spmd_glob_dsum9(v, len)
subroutine spmd_glob_dpsum9(v, len)