36
37
38
39#include "implicit_f.inc"
40#include "comlock.inc"
41
42
43
44#include "com06_c.inc"
45#include "com08_c.inc"
46#include "scr11_c.inc"
47#include "impl1_c.inc"
48#include "sms_c.inc"
49
50
51
52 INTEGER NSN, ITIED, MSR,ICONT,IMP_S,NT_RW
53 INTEGER NSW(*), WEIGHT(*), IDDL(*),IKC(*),NDOF(*), NODNX_SMS(*),WEIGHT_MD(*)
54 my_real x(*), a(*), v(*), rwl(*), ms(*)
55 DOUBLE PRECISION FRWL6(7,6)
56 DOUBLE PRECISION,INTENT(INOUT) :: WFEXT
57 DOUBLE PRECISION,INTENT(INOUT) :: WFEXT_MD
58
59
60
61 INTEGER M3, M2, M1, I, N, N3, N2, N1, J, K, JJ,NINDEX, INDEX(NSN)
63 . ra2, xwl, ywl, zwl, vxw, vyw, vzw, tfxtn, fact,
64 . tfxt, vx, vy, vz, ux, uy, uz, xc, yc, zc, dp, xx, xn,
65 . yn, zn, dv, da, dvt, fnxn, fnyn, fnzn, fnxt, fnyt, fnzt, fndfn,
66 . ftdft, fric, fric2, fcoe, xwlo, ywlo, zwlo,
67 . f1(nsn), f2(nsn), f3(nsn), f4(nsn), f5(nsn), f6(nsn), f7(nsn),
68 . tfxt2, tfxtn2, wewe2
69 DOUBLE PRECISION FRWL6_L(7,6)
70
71 icont=0
73! we need an omp barrier here because each thread initializes
74
75
76
77
78 ra2=(half*rwl(7))**2
79 IF(msr==0)THEN
80 xwlo=rwl(4)
81 ywlo=rwl(5)
82 zwlo=rwl(6)
83 xwl=rwl(4)
84 ywl=rwl(5)
85 zwl=rwl(6)
86 vxw=zero
87 vyw=zero
88 vzw=zero
89 ELSE
90 m3=3*msr
91 m2=m3-1
92 m1=m2-1
93
94 vxw=v(m1)+a(m1)*dt12
95 vyw=v(m2)+a(m2)*dt12
96 vzw=v(m3)+a(m3)*dt12
97 xwlo=x(m1)
98 ywlo=x(m2)
99 zwlo=x(m3)
100 xwl=x(m1)+vxw*dt2
101 ywl=x(m2)+vyw*dt2
102 zwl=x(m3)+vzw*dt2
103 ENDIF
104 tfxt =zero
105 tfxtn=zero
106 tfxt2 =zero
107 tfxtn2=zero
108 nindex=0
109
110 IF(idtmins==0.AND.idtmins_int==0)THEN
111
112 DO i=1,nsn
113 n=nsw(i)
114 n3=3*n
115 n2=n3-1
116 n1=n2-1
117 vx=v(n1)+a(n1)*dt12
118 vy=v(n2)+a(n2)*dt12
119 vz=v(n3)+a(n3)*dt12
120 ux=x(n1)+vx*dt2
121 uy=x(n2)+vy*dt2
122 uz=x(n3)+vz*dt2
123 xc=ux-xwl
124 yc=uy-ywl
125 zc=uz-zwl
126 dp=xc**2+yc**2+zc**2
127 IF(dp <= ra2)THEN
128 icont=1
129 nindex = nindex+1
130 index(nindex) = i
131 END IF
132 END DO
133
134 ELSE
135
136 DO i=1,nsn
137 n=nsw(i)
138 IF(nodnx_sms(n)/=0)cycle
139 n3=3*n
140 n2=n3-1
141 n1=n2-1
142 vx=v(n1)+a(n1)*dt12
143 vy=v(n2)+a(n2)*dt12
144 vz=v(n3)+a(n3)*dt12
145 ux=x(n1)+vx*dt2
146 uy=x(n2)+vy*dt2
147 uz=x(n3)+vz*dt2
148 xc=ux-xwl
149 yc=uy-ywl
150 zc=uz-zwl
151 dp=xc**2+yc**2+zc**2
152 IF(dp <= ra2)THEN
153 icont=1
154 nindex = nindex+1
155 index(nindex) = i
156 END IF
157 END DO
158
159 END IF
160
161 fact=one/dt12
162 DO j = 1,nindex
163 i = index(j)
164 n=nsw(i)
165 n3=3*n
166 n2=n3-1
167 n1=n2-1
168 xc=x(n1)-xwlo
169 yc=x(n2)-ywlo
170 zc=x(n3)-zwlo
171 xx=sqrt(xc**2+yc**2+zc**2)
172 xn=xc/xx
173 yn=yc/xx
174 zn=zc/xx
175 dv=(v(n1)-vxw)*xn+(v(n2)-vyw)*yn+(v(n3)-vzw)*zn
176 da=a(n1)*xn+a(n2)*yn+a(n3)*zn
177 dvt=dv+da*dt12
178 fnxn=dvt*xn*ms(n)
179 fnyn=dvt*yn*ms(n)
180 fnzn=dvt*zn*ms(n)
181 tfxtn = tfxtn - weight_md(n)*fact*
182 . ((v(n1)-vxw)*fnxn+(v(n2)-vyw)*fnyn+(v(n3)-vzw)*fnzn)
183 wewe2 = (1-weight_md(n))*weight(n)
184 tfxtn2 = tfxtn2 - wewe2*fact*
185 . ((v(n1)-vxw)*fnxn+(v(n2)-vyw)*fnyn+(v(n3)-vzw)*fnzn)
186 f1(j) = fnxn*weight_md(n)
187 f2(j) = fnyn*weight_md(n)
188 f3(j) = fnzn*weight_md(n)
189 f4(j) = ms(n)*weight_md(n)
190 IF(itied/=0)THEN
191 fnxt=((v(n1)-vxw)+a(n1)*dt12)*ms(n)-fnxn
192 fnyt=((v(n2)-vyw)+a(n2)*dt12)*ms(n)-fnyn
193 fnzt=((v(n3)-vzw)+a(n3)*dt12)*ms(n)-fnzn
194 fndfn=fnxn**2+fnyn**2+fnzn**2
195 ftdft=fnxt**2+fnyt**2+fnzt**2
196 fric=rwl(13)
197 fric2=fric**2
198 IF(ftdft<=fric2*fndfn.OR.itied==1) THEN
199
200 a(n1)=zero
201 a(n2)=zero
202 a(n3)=zero
203 v(n1)=vxw
204 v(n2)=vyw
205 v(n3)=vzw
206 IF (imp_s==1) THEN
207 IF(ndof(n)>0) THEN
208 jj=iddl(n)+1
209 IF (ikc(jj)==0)ikc(jj)=3
210 IF (ikc(jj+1)==0)ikc(jj+1)=3
211 IF (ikc(jj+2)==0)ikc(jj+2)=3
212 ENDIF
213 ENDIF
214 ELSE
215
216 fcoe=fric*sqrt(fndfn/ftdft)
217 fnxt=fcoe*fnxt
218 fnyt=fcoe*fnyt
219 fnzt=fcoe*fnzt
220 a(n1)=a(n1)-(da*xn+fnxt/(dt12*ms(n)))
221 a(n2)=a(n2)-(da*yn+fnyt/(dt12*ms(n)))
222 a(n3)=a(n3)-(da*zn+fnzt/(dt12*ms(n)))
223 v(n1)=v(n1)-dv*xn
224 v(n2)=v(n2)-dv*yn
225 v(n3)=v(n3)-dv*zn
226 IF (imp_s==1) THEN
227 IF(ndof(n)>0) THEN
228 v(n1)=-dv
229 a(n1)=xn
230 a(n2)=yn
231 a(n3)=zn
232 jj=iddl(n)+1
233 IF (ikc(jj)==0)ikc(jj)=10
234 ENDIF
235 ENDIF
236 tfxt=tfxt-
237 . ((v(n1)-vxw)*fnxt+(v(n2)-vyw)*fnyt+(v(n3)-vzw)*fnzt)
238 . *weight_md(n)
239 wewe2 = (1-weight_md(n))*weight(n)
240 tfxt2=tfxt2-
241 . ((v(n1)-vxw)*fnxt+(v(n2)-vyw)*fnyt+(v(n3)-vzw)*fnzt)
242 . *wewe2
243 ENDIF
244 f5(j) = fnxt*weight_md(n)
245 f6(j) = fnyt*weight_md(n)
246 f7(j) = fnzt*weight_md(n)
247 ELSE
248 f5(j) = zero
249 f6(j) = zero
250 f7(j) = zero
251 a(n1)=a(n1)-da*xn
252 a(n2)=a(n2)-da*yn
253 a(n3)=a(n3)-da*zn
254 v(n1)=v(n1)-dv*xn
255 v(n2)=v(n2)-dv*yn
256 v(n3)=v(n3)-dv*zn
257 IF(imp_s==1) THEN
258 IF(ndof(n)>0) THEN
259 v(n1) = -dv
260 a(n1)=xn
261 a(n2)=yn
262 a(n3)=zn
263 jj=iddl(n)+1
264 IF (ikc(jj)==0)ikc(jj)=10
265 ENDIF
266 ENDIF
267 ENDIF
268 ENDDO
269
270 IF(imconv==1)THEN
271 tfxt=tfxt+half*dt1*tfxtn
272 tfxt2=tfxt2+half*dt1*tfxtn2
273
274 wfext=wfext+tfxt
275 wfext_md=wfext_md+tfxt2
276
277 DO k = 1, 6
278 frwl6_l(1,k) = zero
279 frwl6_l(2,k) = zero
280 frwl6_l(3,k) = zero
281 frwl6_l(4,k) = zero
282 frwl6_l(5,k) = zero
283 frwl6_l(6,k) = zero
284 frwl6_l(7,k) = zero
285 END DO
293
294#include "lockon.inc"
295 DO k = 1, 6
296 frwl6(1,k) = frwl6(1,k)+frwl6_l(1,k)
297 frwl6(2,k) = frwl6(2,k)+frwl6_l(2,k)
298 frwl6(3,k) = frwl6(3,k)+frwl6_l(3,k)
299 frwl6(4,k) = frwl6(4,k)+frwl6_l(4,k)
300 frwl6(5,k) = frwl6(5,k)+frwl6_l(5,k)
301 frwl6(6,k) = frwl6(6,k)+frwl6_l(6,k)
302 frwl6(7,k) = frwl6(7,k)+frwl6_l(7,k)
303 END DO
304#include "lockoff.inc"
305 ENDIF
306
307 IF (imp_s==1) THEN
308 DO j=1,nindex
309 i = index(j)
310 n=nsw(i)
311 IF (ndof(n)>0) THEN
312
313
314 nt_rw = nt_rw + 1
315 END IF
316 ENDDO
317 ENDIF
318
319 RETURN
subroutine sum_6_float(jft, jlt, f, f6, n)