46
47
48
50 USE spmd_exch_flow_tracking_data_mod
51 USE spmd_exch_flow_tracking_data2_mod
52 USE spmd_exch_flow_tracking_data3_mod
53 USE spmd_exch_flow_tracking_data4_mod
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93#include "implicit_f.inc"
94
95
96
97#include "task_c.inc"
98#include "comlock.inc"
99
100
101
102
103
104
105
106
107 INTEGER, INTENT(IN) :: NSPMD,NUMNOD,SX,SV,SW
108 INTEGER, INTENT(IN) :: NALE(NUMNOD), NODFT, NODLT
109 INTEGER, INTENT(IN) :: WEIGHT(NUMNOD)
110 my_real,
INTENT(INout) :: x(3,sx/3)
111 my_real,
INTENT(IN) :: v(3,sv/3), ms(numnod)
112 my_real,
INTENT(INOUT) :: w(3,sw/3)
114
115
116
117 INTEGER :: I,JJ
119 my_real :: sum_mom(3),sum_cog(3)
122 my_real :: vmean(3),ld(6),lw(3),cog(3),itm(6),ld_b(3,3),ld_bp(3,3),ld_bp_b(3,3),ld_tot_b(3,3)
124 my_real :: eigenval(3),eigenvec(3,3)
125 my_real :: x_min_max(6),x_min_max_grid(6)
126 my_real :: r11,r12,r13, r21,r22,r23, r31,r32,r33
135 LOGICAL :: lTENSOR, lDEF,lROT
136 LOGICAL :: HAS_ALE_NODE, HAS_FLOW_NODE
137
138
139
140 cog(1:3) = zero
141
142
143 ltensor = .false.
144 ldef=.false.
145 lrot=.false.
146 scale_def =
ale%GRID%ALPHA
147 scale_rot =
ale%GRID%GAMMA
148 IF(int(
ale%GRID%VGX) == 1)ldef=.true.
149 IF(int(
ale%GRID%VGY) == 1)lrot=.true.
150 IF(ldef .OR. lrot)ltensor=.true.
151
152
153
154
155
156
157
158 IF(ltensor)THEN
159 IF(nspmd > 1)THEN
160 CALL spmd_exch_flow_tracking_data(
ale%GRID%flow_tracking_data, nspmd)
161 ENDIF
162 ale%GRID%flow_tracking_data%EP(1:9) =
ale%GRID%flow_tracking_data%EP(1:9) /
ale%GRID%flow_tracking_data%SUM_M
163
164 ale%GRID%flow_tracking_data%LD(1) =
ale%GRID%flow_tracking_data%EP(1)
165 ale%GRID%flow_tracking_data%LD(2) =
ale%GRID%flow_tracking_data%EP(2)
166 ale%GRID%flow_tracking_data%LD(3) =
ale%GRID%flow_tracking_data%EP(3)
167 ale%GRID%flow_tracking_data%LD(4) = half*(
ale%GRID%flow_tracking_data%EP(4)+
ale%GRID%flow_tracking_data%EP(7))
168 ale%GRID%flow_tracking_data%LD(5) = half*(
ale%GRID%flow_tracking_data%EP(5)+
ale%GRID%flow_tracking_data%EP(8))
169 ale%GRID%flow_tracking_data%LD(6) = half*(
ale%GRID%flow_tracking_data%EP(6)+
ale%GRID%flow_tracking_data%EP(9))
170
171 ale%GRID%flow_tracking_data%LW(1) = half*(
ale%GRID%flow_tracking_data%EP(4)-
ale%GRID%flow_tracking_data%EP(7))
172 ale%GRID%flow_tracking_data%LW(2) = half*(
ale%GRID%flow_tracking_data%EP(5)-
ale%GRID%flow_tracking_data%EP(8))
173 ale%GRID%flow_tracking_data%LW(3) = half*(
ale%GRID%flow_tracking_data%EP(6)-
ale%GRID%flow_tracking_data%EP(9))
174 ENDIF
175
176
178
179
180
181 ale%GRID%flow_tracking_data%MOM_L(1:3) = zero
182 ale%GRID%flow_tracking_data%COG_L(1:3) = zero
183 ale%GRID%flow_tracking_data%SUM_M = zero
184 sum_mom(1:3) = zero
185 sum_cog(1:3) = zero
186 sum_m = zero
187 DO i = nodft, nodlt
188 IF(iabs(nale(i)) == 1)THEN
189 ms_node = ms(i)*weight(i)
190 sum_mom(1) = sum_mom(1) + ms_node*v(1,i)
191 sum_mom(2) = sum_mom(2) + ms_node*v(2,i)
192 sum_mom(3) = sum_mom(3) + ms_node*v(3,i)
193 sum_m = sum_m + ms_node
194 sum_cog(1) = sum_cog(1) + ms_node*x(1,i)
195 sum_cog(2) = sum_cog(2) + ms_node*x(2,i)
196 sum_cog(3) = sum_cog(3) + ms_node*x(3,i)
197 ENDIF
198 ENDDO
200#include "lockon.inc"
201
202 ale%GRID%flow_tracking_data%MOM_L(1) =
ale%GRID%flow_tracking_data%MOM_L(1) + sum_mom(1)
203 ale%GRID%flow_tracking_data%MOM_L(2) =
ale%GRID%flow_tracking_data%MOM_L(2) + sum_mom(2)
204 ale%GRID%flow_tracking_data%MOM_L(3) =
ale%GRID%flow_tracking_data%MOM_L(3) + sum_mom(3)
205 ale%GRID%flow_tracking_data%SUM_M =
ale%GRID%flow_tracking_data%SUM_M + sum_m
206 ale%GRID%flow_tracking_data%COG_L(1) =
ale%GRID%flow_tracking_data%COG_L(1) + sum_cog(1)
207 ale%GRID%flow_tracking_data%COG_L(2) =
ale%GRID%flow_tracking_data%COG_L(2) + sum_cog(2)
208 ale%GRID%flow_tracking_data%COG_L(3) =
ale%GRID%flow_tracking_data%COG_L(3) + sum_cog(3)
209#include "lockoff.inc"
211
212
213
214 IF(nspmd > 1)THEN
215 CALL spmd_exch_flow_tracking_data2(
ale%GRID%flow_tracking_data, nspmd)
216 ENDIF
217
218
219 vmean(1:3) = zero
220 sum_ms =
ale%GRID%flow_tracking_data%SUM_M
221 IF(sum_ms > em20)THEN
222 vmean(1) =
ale%GRID%flow_tracking_data%MOM_L(1)/sum_ms
223 vmean(2) =
ale%GRID%flow_tracking_data%MOM_L(2)/sum_ms
224 vmean(3) =
ale%GRID%flow_tracking_data%MOM_L(3)/sum_ms
225 cog(1) =
ale%GRID%flow_tracking_data%COG_L(1)/sum_ms
226 cog(2) =
ale%GRID%flow_tracking_data%COG_L(2)/sum_ms
227 cog(3) =
ale%GRID%flow_tracking_data%COG_L(3)/sum_ms
228 END IF
229
230
231
232
233 ale%GRID%flow_tracking_data%ITM_L(1:6) = zero
235 sum_itm(1:6) = zero
236 DO i = nodft, nodlt
237 IF(iabs(nale(i)) == 1)THEN
238 xx = x(1,i)-cog(1)
239 yy = x(2,i)-cog(2)
240 zz = x(3,i)-cog(3)
241 ms_node = ms(i)*weight(i)
242 sum_itm(1) = sum_itm(1) + ms_node*(yy*yy+zz*zz)
243 sum_itm(2) = sum_itm(2) + ms_node*(xx*xx+zz*zz)
244 sum_itm(3) = sum_itm(3) + ms_node*(xx*xx+yy*yy)
245 sum_itm(4) = sum_itm(4) - ms_node*(xx*yy)
246 sum_itm(5) = sum_itm(5) - ms_node*(yy*zz)
247 sum_itm(6) = sum_itm(6) - ms_node*(xx*zz)
248 ENDIF
249 ENDDO
250#include "lockon.inc"
251
252 ale%GRID%flow_tracking_data%ITM_L(1) =
ale%GRID%flow_tracking_data%ITM_L(1) + sum_itm(1)
253 ale%GRID%flow_tracking_data%ITM_L(2) =
ale%GRID%flow_tracking_data%ITM_L(2) + sum_itm(2)
254 ale%GRID%flow_tracking_data%ITM_L(3) =
ale%GRID%flow_tracking_data%ITM_L(3) + sum_itm(3)
255 ale%GRID%flow_tracking_data%ITM_L(4) =
ale%GRID%flow_tracking_data%ITM_L(4) + sum_itm(4)
256 ale%GRID%flow_tracking_data%ITM_L(5) =
ale%GRID%flow_tracking_data%ITM_L(5) + sum_itm(5)
257 ale%GRID%flow_tracking_data%ITM_L(6) =
ale%GRID%flow_tracking_data%ITM_L(6) + sum_itm(6)
258#include "lockoff.inc"
260
261
262 IF(nspmd > 1)THEN
263 CALL spmd_exch_flow_tracking_data3(
ale%GRID%flow_tracking_data, nspmd)
264 ENDIF
265
266 sum_ms =
ale%GRID%flow_tracking_data%SUM_M
267 IF(sum_ms > em20)THEN
268 itm(1) =
ale%GRID%flow_tracking_data%ITM_L(1)/sum_ms
269 itm(2) =
ale%GRID%flow_tracking_data%ITM_L(2)/sum_ms
270 itm(3) =
ale%GRID%flow_tracking_data%ITM_L(3)/sum_ms
271 itm(4) =
ale%GRID%flow_tracking_data%ITM_L(4)/sum_ms
272 itm(5) =
ale%GRID%flow_tracking_data%ITM_L(5)/sum_ms
273 itm(6) =
ale%GRID%flow_tracking_data%ITM_L(6)/sum_ms
274 END IF
275
276
277
278
279 CALL valpvec(itm,eigenval,eigenvec,1)
280
281 IF(dt1 == zero)THEN
282 ale%GRID%flow_tracking_data%EIGENVEC(1:3,1)=eigenvec(1:3,1)
283 ale%GRID%flow_tracking_data%EIGENVEC(1:3,2)=eigenvec(1:3,2)
284 ale%GRID%flow_tracking_data%EIGENVEC(1:3,3)=eigenvec(1:3,3)
285 ENDIF
286 eigenvec(1:3,1) =
ale%GRID%flow_tracking_data%EIGENVEC(1:3,1)
287 eigenvec(1:3,2) =
ale%GRID%flow_tracking_data%EIGENVEC(1:3,2)
288 eigenvec(1:3,3) =
ale%GRID%flow_tracking_data%EIGENVEC(1:3,3)
289
290
291
292
293 r11=
ale%GRID%flow_tracking_data%EIGENVEC(1,1)
294 r21=
ale%GRID%flow_tracking_data%EIGENVEC(1,2)
295 r31=
ale%GRID%flow_tracking_data%EIGENVEC(1,3)
296
297 r12=
ale%GRID%flow_tracking_data%EIGENVEC(2,1)
298 r22=
ale%GRID%flow_tracking_data%EIGENVEC(2,2)
299 r32=
ale%GRID%flow_tracking_data%EIGENVEC(2,3)
300
301 r13=
ale%GRID%flow_tracking_data%EIGENVEC(3,1)
302 r23=
ale%GRID%flow_tracking_data%EIGENVEC(3,2)
303 r33=
ale%GRID%flow_tracking_data%EIGENVEC(3,3)
304
305
306
307
309
310 IF(dt1 == zero)THEN
311 ms_elem_mean = ep20
312 IF(
ale%GRID%flow_tracking_data%NUM_ELEM_ALE > 0)
THEN
313 ms_elem_mean =
ale%GRID%flow_tracking_data%SUM_M / (one*
ale%GRID%flow_tracking_data%NUM_ELEM_ALE)
314 ENDIF
315 ale%GRID%flow_tracking_data%MS_ELEM_MEAN_0 = ms_elem_mean
316 ENDIF
317 ms_elem_mean =
ale%GRID%flow_tracking_data%MS_ELEM_MEAN_0
318
319
320
321
322 ale%GRID%flow_tracking_data%X_MIN_MAX(1:3) = ep20
323 ale%GRID%flow_tracking_data%X_MIN_MAX(4:6) = -ep20
324 ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(1:3) = ep20
325 ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(4:6) = -ep20
327
328 x_min_max(1:3) = ep20
329 x_min_max(4:6) = -ep20
330 x_min_max_grid(1:3) = ep20
331 x_min_max_grid(4:6) = -ep20
332
333 has_ale_node = .false.
334 has_flow_node = .false.
335
336 DO i = nodft, nodlt
337 IF(iabs(nale(i)) == 1)THEN
338 has_ale_node = .true.
339
340 x_trans(1) = r11*(x(1,i)-cog(1))+r12*(x(2,i)-cog(2))+r13*(x(3,i)-cog(3))
341 x_trans(2) = r21*(x(1,i)-cog(1))+r22*(x(2,i)-cog(2))+r23*(x(3,i)-cog(3))
342 x_trans(3) = r31*(x(1,i)-cog(1))+r32*(x(2,i)-cog(2))+r33*(x(3,i)-cog(3))
343
344 x_min_max_grid(1) =
min(x_min_max_grid(1),x_trans(1))
345 x_min_max_grid(2) =
min(x_min_max_grid(2),x_trans(2))
346 x_min_max_grid(3) =
min(x_min_max_grid(3),x_trans(3))
347 x_min_max_grid(4) =
max(x_min_max_grid(4),x_trans(1))
348 x_min_max_grid(5) =
max(x_min_max_grid(5),x_trans(2))
349 x_min_max_grid(6) =
max(x_min_max_grid(6),x_trans(3))
350
351 ms_node = ms(i)*weight(i)
352 ratio(1) = ms_node / ms_elem_mean
353 IF(ratio(1) > one)THEN
354 has_flow_node = .true.
355 x_min_max(1) =
min(x_min_max(1),x_trans(1))
356 x_min_max(2) =
min(x_min_max(2),x_trans(2))
357 x_min_max(3) =
min(x_min_max(3),x_trans(3))
358 x_min_max(4) =
max(x_min_max(4),x_trans(1))
359 x_min_max(5) =
max(x_min_max(5),x_trans(2))
360 x_min_max(6) =
max(x_min_max(6),x_trans(3))
361 ENDIF
362 ENDIF
363 ENDDO
364
365#include "lockon.inc"
366
367
368 IF(has_flow_node)THEN
369 ale%GRID%flow_tracking_data%X_MIN_MAX(1) =
min(
ale%GRID%flow_tracking_data%X_MIN_MAX(1), x_min_max(1))
370 ale%GRID%flow_tracking_data%X_MIN_MAX(2) =
min(
ale%GRID%flow_tracking_data%X_MIN_MAX(2), x_min_max(2))
371 ale%GRID%flow_tracking_data%X_MIN_MAX(3) =
min(
ale%GRID%flow_tracking_data%X_MIN_MAX(3), x_min_max(3))
372 ale%GRID%flow_tracking_data%X_MIN_MAX(4) =
max(
ale%GRID%flow_tracking_data%X_MIN_MAX(4), x_min_max(4))
373 ale%GRID%flow_tracking_data%X_MIN_MAX(5) =
max(
ale%GRID%flow_tracking_data%X_MIN_MAX(5), x_min_max(5))
374 ale%GRID%flow_tracking_data%X_MIN_MAX(6) =
max(
ale%GRID%flow_tracking_data%X_MIN_MAX(6), x_min_max(6))
375 ENDIF
376
377 IF(has_ale_node)THEN
378 ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(1) =
min(
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(1), x_min_max_grid(1))
379 ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(2) =
min(
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(2), x_min_max_grid(2))
380 ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(3) =
min(
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(3), x_min_max_grid(3))
381 ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(4) =
max(
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(4), x_min_max_grid
382 ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(5) =
max(
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(5), x_min_max_grid(5))
383 ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(6) =
max(
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(6), x_min_max_grid(6))
384 ENDIF
385#include "lockoff.inc"
387
388
389 IF(nspmd > 1)THEN
390 CALL spmd_exch_flow_tracking_data4(
ale%GRID%flow_tracking_data, nspmd)
391 ENDIF
392
394
395
396
397
398
399 beta(1)=
ale%GRID%flow_tracking_data%X_MIN_MAX(1)/
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(1)
400 beta(4)=
ale%GRID%flow_tracking_data%X_MIN_MAX(4)/
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(4)
401
402 beta(2)=
ale%GRID%flow_tracking_data%X_MIN_MAX(2)/
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(2)
403 beta(5)=
ale%GRID%flow_tracking_data%X_MIN_MAX(5)/
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(5)
404
405 beta(3)=
ale%GRID%flow_tracking_data%X_MIN_MAX
406 beta(6)=
ale%GRID%flow_tracking_data%X_MIN_MAX(6)/
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(6)
407
408 IF(dt1 == zero)THEN
409 ale%GRID%flow_tracking_data%BETA0(1) = beta(1)
410 ale%GRID%flow_tracking_data%BETA0(2) = beta(2)
411 ale%GRID%flow_tracking_data%BETA0(3) = beta(3)
412 ale%GRID%flow_tracking_data%BETA0(4) = beta(4)
413 ale%GRID%flow_tracking_data%BETA0(5) = beta(5)
414 ale%GRID%flow_tracking_data%BETA0(6) = beta(6)
415 END IF
417
418 beta0(1) =
ale%GRID%flow_tracking_data%BETA0(1)
419 beta0(2) =
ale%GRID%flow_tracking_data%BETA0(2)
420 beta0(3) =
ale%GRID%flow_tracking_data%BETA0(3)
421 beta0(4) =
ale%GRID%flow_tracking_data%BETA0(4)
422 beta0(5) =
ale%GRID%flow_tracking_data%BETA0(5)
423 beta0(6) =
ale%GRID%flow_tracking_data%BETA0(6)
424
425
426
427
429
430 ld(1:6)=
ale%GRID%flow_tracking_data%LD(1:6)
431 lw(1:3)=
ale%GRID%flow_tracking_data%LW(1:3)
432 ale%GRID%flow_tracking_data%SUM_M = zero
433
434 ld_b(1,1:3) = (/ld(1),ld(4),ld(5)/)
435 ld_b(2,1:3) = (/ld(4),ld(2),ld(6)/)
436 ld_b(3,1:3) = (/ld(5),ld(6),ld(3)/)
437
438 ld_norm = zero
439 ld_norm = ld_norm + abs(ld_b(1,1)) + abs(ld_b(1,2)) + abs(ld_b(1,3))
440 ld_norm = ld_norm + abs(ld_b(2,1)) + abs(ld_b(2,2)) + abs(ld_b(2,3))
441 ld_norm = ld_norm + abs(ld_b(3,1)) + abs(ld_b(3,2)) + abs(ld_b(3,3))
442 ld_norm = ld_norm / nine
443
445 IF(
ale%GRID%flow_tracking_data%LD_NORM < ld_norm)
THEN
446 ale%GRID%flow_tracking_data%LD_NORM = ld_norm
447 ENDIF
448 ld_norm =
ale%GRID%flow_tracking_data%LD_NORM
449
450
451
452
453
454
455
456 p_b_bp(1:3,1)=eigenvec(1:3,1)
457 p_b_bp(1:3,2)=eigenvec(1:3,2)
458 p_b_bp(1:3,3)=eigenvec(1:3,3)
459
460
461
462 fac(1) =
max(one, beta(1)/beta0(1), beta(4)/beta0(4))
463 fac(2) =
max(one, beta(2)/beta0(2), beta(5)/beta0(5))
464 fac(3) =
max(one, beta(3)/beta0(3), beta(6)/beta0(6))
465
466
467 ksi = ep02
468 fac(1) = half*ld_norm *(one + ksi*(fac(1)-one)**2)
469 fac(2) = half*ld_norm *(one + ksi*(fac(2)-one)**2)
470 fac(3) = half*ld_norm *(one + ksi*(fac(3)-one)**2)
471
472
473 ld_bp(1,1:3) = (/ fac(1) , zero , zero /)
474 ld_bp(2,1:3) = (/ zero , fac(2) , zero /)
475 ld_bp(3,1:3) = (/ zero , zero , fac(3) /)
476
477
478 ld_bp_b = matmul( p_b_bp, matmul(ld_bp, transpose(p_b_bp)) )
479
480
481
482
483
484
485
486 ld_tot_b = ld_b + ld_bp_b
487
488 ld(1)=ld_tot_b(1,1)
489 ld(2)=ld_tot_b(2,2)
490 ld(3)=ld_tot_b(3,3)
491 ld(4)=ld_tot_b(1,2)
492 ld(5)=ld_tot_b(1,3)
493 ld(6)=ld_tot_b(2,3)
494
495
496
497
498 DO i = nodft, nodlt
499 IF(iabs(nale(i)) == 1) THEN
500
501 w(1,i)=vmean(1)
502 w(2,i)=vmean(2)
503 w(3,i)=vmean(3)
504
505
506 xx = (x(1,i)-cog(1))
507 yy = (x(2,i)-cog(2))
508 zz = (x(3,i)-cog(3))
509
510
511 IF(ldef)THEN
512
513 dw(1) = scale_def*(ld(1)*xx+ld(4)*yy+ld(5)*zz)
514 dw(2) = scale_def*(ld(4)*xx+ld(2)*yy+ld(6)*zz)
515 dw(3) = scale_def*(ld(5)*xx+ld(6)*yy+ld(3)*zz)
516
517 w(1,i) =w(1,i)+ dw(1)
518 w(2,i) =w(2,i)+ dw(2)
519 w(3,i) =w(3,i)+ dw(3)
520 ENDIF
521
522
523 IF(lrot)THEN
524 w(1,i) = w(1,i) + scale_rot*(+lw(1)*yy+lw(2)*zz)
525 w(2,i) = w(2,i) + scale_rot*(-lw(1)*xx+lw(3)*zz)
526 w(3,i) = w(3,i) + scale_rot*(-lw(2)*xx-lw(3)*yy)
527 ENDIF
528
529 ELSEIF(nale(i) == 0)THEN
530
531 w(1,i)=v(1,i)
532 w(2,i)=v(2,i)
533 w(3,i)=v(3,i)
534 ELSE
535
536 w(1,i)=zero
537 w(2,i)=zero
538 w(3,i)=zero
539 ENDIF
540 ENDDO
541
542
543
544
545 IF(lrot)THEN
546
547 DO jj=1,3
548 xx = eigenvec(1,jj)
549 yy = eigenvec(2,jj)
550 zz = eigenvec(3,jj)
551 eigenvec(1,jj) = xx + dt1*scale_rot* (+lw(1)*yy+lw(2)*zz)
552 eigenvec(2,jj) = yy + dt1*scale_rot* (-lw(1)*xx+lw(3)*zz)
553 eigenvec(3,jj) = zz + dt1*scale_rot* (-lw(2)*xx-lw(3)*yy)
554 ENDDO
555
556 ale%GRID%flow_tracking_data%EIGENVEC(1:3,1)=eigenvec(1:3,1)
557 ale%GRID%flow_tracking_data%EIGENVEC(1:3,2)=eigenvec(1:3,2)
558 ale%GRID%flow_tracking_data%EIGENVEC(1:3,3)=eigenvec(1:3,3)
559 ENDIF
560
561
562 RETURN
subroutine valpvec(sig, val, vec, nel)