Skip to content

Commit 33ee6b6

Browse files
committed
Force calculation improvements
(cherry picked from commit 2a034dc) (cherry picked from commit 1d8b109)
1 parent 84c46e0 commit 33ee6b6

1 file changed

Lines changed: 11 additions & 31 deletions

File tree

src/simulation/m_ibm.fpp

Lines changed: 11 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,9 +1100,6 @@ contains
11001100
end if
11011101
end do
11021102

1103-
! Update the force values atomically to prevent race conditions
1104-
call s_cross_product(radial_vector, local_force_contribution, local_torque_contribution)
1105-
11061103
! get the viscous stress and add its contribution if that is considered
11071104
! TODO :: This is really bad code
11081105
if (viscous) then
@@ -1113,46 +1110,29 @@ contains
11131110
dynamic_viscosity = dynamic_viscosity + (q_prim_vf(fluid_idx + advxb - 1)%sf(i, j, k)*dynamic_viscosities(fluid_idx))
11141111
end do
11151112

1116-
! get the linear force component first
1113+
! get the linear force components first
11171114
call s_compute_viscous_stress_tensor(viscous_stress_div_1, q_prim_vf, dynamic_viscosity, i - 1, j, k)
11181115
call s_compute_viscous_stress_tensor(viscous_stress_div_2, q_prim_vf, dynamic_viscosity, i + 1, j, k)
1119-
viscous_stress_div = (viscous_stress_div_2 - viscous_stress_div_1)/(2._wp*dx) ! get the x derivative of the viscous stress tensor
1120-
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
1121-
do l = 1, 3
1122-
! take the cross products for the torque component
1123-
call s_cross_product(radial_vector, viscous_stress_div_1(l, 1:3), viscous_cross_1(l, 1:3))
1124-
call s_cross_product(radial_vector, viscous_stress_div_2(l, 1:3), viscous_cross_2(l, 1:3))
1125-
end do
1126-
1127-
viscous_stress_div = (viscous_cross_2 - viscous_cross_1)/(2._wp*dx) ! get the x derivative of the cross product
1128-
local_torque_contribution(1:3) = local_torque_contribution(1:3) + viscous_stress_div(1, 1:3) ! apply the cross product derivative to the torque
1116+
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
1117+
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
11291118

11301119
call s_compute_viscous_stress_tensor(viscous_stress_div_1, q_prim_vf, dynamic_viscosity, i, j - 1, k)
11311120
call s_compute_viscous_stress_tensor(viscous_stress_div_2, q_prim_vf, dynamic_viscosity, i, j + 1, k)
1132-
viscous_stress_div = (viscous_stress_div_2 - viscous_stress_div_1)/(2._wp*dy)
1133-
local_force_contribution(1:3) = local_force_contribution(1:3) + viscous_stress_div(2, 1:3)
1134-
do l = 1, 3
1135-
call s_cross_product(radial_vector, viscous_stress_div_1(l, 1:3), viscous_cross_1(l, 1:3))
1136-
call s_cross_product(radial_vector, viscous_stress_div_2(l, 1:3), viscous_cross_2(l, 1:3))
1137-
end do
1138-
1139-
viscous_stress_div = (viscous_cross_2 - viscous_cross_1)/(2._wp*dy)
1140-
local_torque_contribution(1:3) = local_torque_contribution(1:3) + viscous_stress_div(2, 1:3)
1121+
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
1122+
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
11411123

11421124
if (num_dims == 3) then
11431125
call s_compute_viscous_stress_tensor(viscous_stress_div_1, q_prim_vf, dynamic_viscosity, i, j, k - 1)
11441126
call s_compute_viscous_stress_tensor(viscous_stress_div_2, q_prim_vf, dynamic_viscosity, i, j, k + 1)
1145-
viscous_stress_div = (viscous_stress_div_2 - viscous_stress_div_1)/(2._wp*dz)
1146-
local_force_contribution(1:3) = local_force_contribution(1:3) + viscous_stress_div(3, 1:3)
1147-
do l = 1, 3
1148-
call s_cross_product(radial_vector, viscous_stress_div_1(l, 1:3), viscous_cross_1(l, 1:3))
1149-
call s_cross_product(radial_vector, viscous_stress_div_2(l, 1:3), viscous_cross_2(l, 1:3))
1150-
end do
1151-
viscous_stress_div = (viscous_cross_2 - viscous_cross_1)/(2._wp*dz)
1152-
local_torque_contribution(1:3) = local_torque_contribution(1:3) + viscous_stress_div(3, 1:3)
1127+
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 second-row of viscous stress tensor
1128+
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
11531129
end if
1130+
11541131
end if
11551132

1133+
call s_cross_product(radial_vector, local_force_contribution, local_torque_contribution)
1134+
1135+
! Update the force values atomically to prevent race conditions
11561136
do l = 1, 3
11571137
$:GPU_ATOMIC(atomic='update')
11581138
forces(ib_idx, l) = forces(ib_idx, l) + (local_force_contribution(l)*cell_volume)

0 commit comments

Comments
 (0)