Skip to content

Commit 309c45a

Browse files
IBM force calculation simplification (Dr Bala recommendations) (#1234)
Co-authored-by: Spencer Bryngelson <sbryngelson@gmail.com>
1 parent e59272a commit 309c45a

1 file changed

Lines changed: 13 additions & 34 deletions

File tree

src/simulation/m_ibm.fpp

Lines changed: 13 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -997,7 +997,7 @@ contains
997997

998998
integer :: gp_id, i, j, k, l, q, ib_idx, fluid_idx
999999
real(wp), dimension(num_ibs, 3) :: forces, torques
1000-
real(wp), dimension(1:3, 1:3) :: viscous_stress_div, viscous_stress_div_1, viscous_stress_div_2, viscous_cross_1, viscous_cross_2 ! viscous stress tensor with temp vectors to hold divergence calculations
1000+
real(wp), dimension(1:3, 1:3) :: viscous_stress_div, viscous_stress_div_1, viscous_stress_div_2 ! viscous stress tensor with temp vectors to hold divergence calculations
10011001
real(wp), dimension(1:3) :: local_force_contribution, radial_vector, local_torque_contribution, vel
10021002
real(wp) :: cell_volume, dx, dy, dz, dynamic_viscosity
10031003
#:if not MFC_CASE_OPTIMIZATION and USING_AMD
@@ -1021,7 +1021,7 @@ contains
10211021
end do
10221022
end if
10231023

1024-
$:GPU_PARALLEL_LOOP(private='[ib_idx,fluid_idx, radial_vector,local_force_contribution,cell_volume,local_torque_contribution, dynamic_viscosity, viscous_stress_div, viscous_stress_div_1, viscous_stress_div_2, viscous_cross_1, viscous_cross_2, dx, dy, dz]', copy='[forces,torques]', copyin='[ib_markers,patch_ib,dynamic_viscosities]', collapse=3)
1024+
$:GPU_PARALLEL_LOOP(private='[ib_idx,fluid_idx, radial_vector,local_force_contribution,cell_volume,local_torque_contribution, dynamic_viscosity, viscous_stress_div, viscous_stress_div_1, viscous_stress_div_2, dx, dy, dz]', copy='[forces,torques]', copyin='[ib_markers,patch_ib,dynamic_viscosities]', collapse=3)
10251025
do i = 0, m
10261026
do j = 0, n
10271027
do k = 0, p
@@ -1050,11 +1050,7 @@ contains
10501050
end if
10511051
end do
10521052

1053-
! Update the force values atomically to prevent race conditions
1054-
call s_cross_product(radial_vector, local_force_contribution, local_torque_contribution)
1055-
10561053
! get the viscous stress and add its contribution if that is considered
1057-
! TODO :: This is really bad code
10581054
if (viscous) then
10591055
! compute the volume-weighted local dynamic viscosity
10601056
dynamic_viscosity = 0._wp
@@ -1063,46 +1059,29 @@ contains
10631059
dynamic_viscosity = dynamic_viscosity + (q_prim_vf(fluid_idx + advxb - 1)%sf(i, j, k)*dynamic_viscosities(fluid_idx))
10641060
end do
10651061

1066-
! get the linear force component first
1062+
! get the linear force components first
10671063
call s_compute_viscous_stress_tensor(viscous_stress_div_1, q_prim_vf, dynamic_viscosity, i - 1, j, k)
10681064
call s_compute_viscous_stress_tensor(viscous_stress_div_2, q_prim_vf, dynamic_viscosity, i + 1, j, k)
1069-
viscous_stress_div = (viscous_stress_div_2 - viscous_stress_div_1)/(2._wp*dx) ! get the x derivative of the viscous stress tensor
1070-
local_force_contribution(1:3) = local_force_contribution(1:3) + viscous_stress_div(1, 1:3) ! add te x components of the derivative to the force
1071-
do l = 1, 3
1072-
! take the cross products for the torque component
1073-
call s_cross_product(radial_vector, viscous_stress_div_1(l, 1:3), viscous_cross_1(l, 1:3))
1074-
call s_cross_product(radial_vector, viscous_stress_div_2(l, 1:3), viscous_cross_2(l, 1:3))
1075-
end do
1076-
1077-
viscous_stress_div = (viscous_cross_2 - viscous_cross_1)/(2._wp*dx) ! get the x derivative of the cross product
1078-
local_torque_contribution(1:3) = local_torque_contribution(1:3) + viscous_stress_div(1, 1:3) ! apply the cross product derivative to the torque
1065+
viscous_stress_div(1, 1:3) = (viscous_stress_div_2(1, 1:3) - viscous_stress_div_1(1, 1:3))/(2._wp*dx) ! get x derivative of the first-row of viscous stress tensor
1066+
local_force_contribution(1:3) = local_force_contribution(1:3) + viscous_stress_div(1, 1:3) ! add the x components of the divergence to the force
10791067

10801068
call s_compute_viscous_stress_tensor(viscous_stress_div_1, q_prim_vf, dynamic_viscosity, i, j - 1, k)
10811069
call s_compute_viscous_stress_tensor(viscous_stress_div_2, q_prim_vf, dynamic_viscosity, i, j + 1, k)
1082-
viscous_stress_div = (viscous_stress_div_2 - viscous_stress_div_1)/(2._wp*dy)
1083-
local_force_contribution(1:3) = local_force_contribution(1:3) + viscous_stress_div(2, 1:3)
1084-
do l = 1, 3
1085-
call s_cross_product(radial_vector, viscous_stress_div_1(l, 1:3), viscous_cross_1(l, 1:3))
1086-
call s_cross_product(radial_vector, viscous_stress_div_2(l, 1:3), viscous_cross_2(l, 1:3))
1087-
end do
1088-
1089-
viscous_stress_div = (viscous_cross_2 - viscous_cross_1)/(2._wp*dy)
1090-
local_torque_contribution(1:3) = local_torque_contribution(1:3) + viscous_stress_div(2, 1:3)
1070+
viscous_stress_div(2, 1:3) = (viscous_stress_div_2(2, 1:3) - viscous_stress_div_1(2, 1:3))/(2._wp*dy) ! get y derivative of the second-row of viscous stress tensor
1071+
local_force_contribution(1:3) = local_force_contribution(1:3) + viscous_stress_div(2, 1:3) ! add the y components of the divergence to the force
10911072

10921073
if (num_dims == 3) then
10931074
call s_compute_viscous_stress_tensor(viscous_stress_div_1, q_prim_vf, dynamic_viscosity, i, j, k - 1)
10941075
call s_compute_viscous_stress_tensor(viscous_stress_div_2, q_prim_vf, dynamic_viscosity, i, j, k + 1)
1095-
viscous_stress_div = (viscous_stress_div_2 - viscous_stress_div_1)/(2._wp*dz)
1096-
local_force_contribution(1:3) = local_force_contribution(1:3) + viscous_stress_div(3, 1:3)
1097-
do l = 1, 3
1098-
call s_cross_product(radial_vector, viscous_stress_div_1(l, 1:3), viscous_cross_1(l, 1:3))
1099-
call s_cross_product(radial_vector, viscous_stress_div_2(l, 1:3), viscous_cross_2(l, 1:3))
1100-
end do
1101-
viscous_stress_div = (viscous_cross_2 - viscous_cross_1)/(2._wp*dz)
1102-
local_torque_contribution(1:3) = local_torque_contribution(1:3) + viscous_stress_div(3, 1:3)
1076+
viscous_stress_div(3, 1:3) = (viscous_stress_div_2(3, 1:3) - viscous_stress_div_1(3, 1:3))/(2._wp*dz) ! get z derivative of the third-row of viscous stress tensor
1077+
local_force_contribution(1:3) = local_force_contribution(1:3) + viscous_stress_div(3, 1:3) ! add the z components of the divergence to the force
11031078
end if
1079+
11041080
end if
11051081

1082+
call s_cross_product(radial_vector, local_force_contribution, local_torque_contribution)
1083+
1084+
! Update the force and torque values atomically to prevent race conditions
11061085
do l = 1, 3
11071086
$:GPU_ATOMIC(atomic='update')
11081087
forces(ib_idx, l) = forces(ib_idx, l) + (local_force_contribution(l)*cell_volume)

0 commit comments

Comments
 (0)