44 2 NODFT ,NODLT ,WEIGHT ,NUMNOD , DT1 ,
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
93#include "implicit_f.inc"
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)
118 my_real :: SUM_MS,MS_NODE, ksi
119 my_real :: SUM_MOM(3),(3)
121 my_real :: sum_itm(6)
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)
123 my_real :: p_b_bp(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
127 my_real :: x_trans(3)
130 my_real :: scale_def,scale_rot
131 my_real :: ratio(3), dw(3)
132 my_real :: beta(6),beta0(6)
134 my_real :: ms_elem_mean
135 LOGICAL :: lTENSOR, lDEF,lROT
136 LOGICAL :: HAS_ALE_NODE, HAS_FLOW_NODE
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.
160 CALL spmd_exch_flow_tracking_data(
ale%GRID%flow_tracking_data, nspmd)
162 ale%GRID%flow_tracking_data%EP(1:9) =
ale%GRID%flow_tracking_data%EP(1:9) /
ale%GRID%flow_tracking_data%SUM_M
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))
171 ale%GRID%flow_tracking_data%LW(1) = half*(
ale%GRID%flow_tracking_data%EP(4)-
ale%GRID%flow_tracking_data%EP
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))
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
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)
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"
215 CALL spmd_exch_flow_tracking_data2(
ale%GRID%flow_tracking_data, nspmd)
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
233 ale%GRID%flow_tracking_data%ITM_L(1:6) = zero
237 IF(iabs(nale(i)) == 1)
THEN
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)
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"
263 CALL spmd_exch_flow_tracking_data3(
ale%GRID%flow_tracking_data, nspmd)
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
279 CALL valpvec(itm,eigenval,eigenvec,1)
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)
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)
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)
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)
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)
312 IF(
ale%GRID%flow_tracking_data%NUM_ELEM_ALE > 0)
THEN
315 ale%GRID%flow_tracking_data%MS_ELEM_MEAN_0 = ms_elem_mean
317 ms_elem_mean =
ale%GRID%flow_tracking_data%MS_ELEM_MEAN_0
322 ale%GRID%flow_tracking_data%X_MIN_MAX(1:3)
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
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
333 has_ale_node = .false.
334 has_flow_node = .false.
337 IF(iabs(nale(i)) == 1)
THEN
338 has_ale_node = .true.
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))
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))
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))
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))
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(4))
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))
385#include "lockoff.inc"
390 CALL spmd_exch_flow_tracking_data4(
ale%GRID%flow_tracking_data, nspmd)
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)
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)
405 beta(3)=
ale%GRID%flow_tracking_data%X_MIN_MAX(3)/
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(3)
406 beta(6)=
ale%GRID%flow_tracking_data%X_MIN_MAX(6)/
ale%GRID%flow_tracking_data%X_MIN_MAX_GRID(6)
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)
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)
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
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)/)
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
445 IF(
ale%GRID%flow_tracking_data%LD_NORM < ld_norm)
THEN
446 ale%GRID%flow_tracking_data%LD_NORM = ld_norm
448 ld_norm =
ale%GRID%flow_tracking_data%LD_NORM
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)
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))
468 fac(1) = half*ld_norm *(one + ksi*(fac(1)-one)**2)
469 fac(2) = half*ld_norm *(one + ksi*(fac(2)-one
470 fac(3) = half*ld_norm *(one + ksi*(fac(3)-one)**2)
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) /)
478 ld_bp_b = matmul( p_b_bp, matmul(ld_bp, transpose(p_b_bp)) )
486 ld_tot_b = ld_b + ld_bp_b
499 IF(iabs(nale(i)) == 1)
THEN
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)
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)
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)
529 ELSEIF(nale(i) == 0)
THEN
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)
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)