Skip to content

Commit 3fdebb6

Browse files
committed
Fix IBM non-Newtonian viscosity: compute local shear rate per cell instead of gdot=1
1 parent d02076c commit 3fdebb6

1 file changed

Lines changed: 20 additions & 9 deletions

File tree

src/simulation/m_ibm.fpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ module m_ibm
1919
use m_ib_patches
2020
use m_viscous
2121
use m_hb_function
22+
use m_re_visc
2223
use m_model
2324
use m_collisions
2425

@@ -914,6 +915,7 @@ contains
914915
& viscous_stress_div_2 ! viscous stress tensor with temp vectors to hold divergence calculations
915916
real(wp), dimension(1:3) :: local_force_contribution, radial_vector, local_torque_contribution
916917
real(wp) :: cell_volume, dx, dy, dz, dynamic_viscosity
918+
real(wp) :: D_xx, D_yy, D_zz, D_xy, D_xz, D_yz, shear_rate, local_mu
917919

918920
#:if not MFC_CASE_OPTIMIZATION and USING_AMD
919921
real(wp), dimension(3) :: dynamic_viscosities
@@ -929,10 +931,7 @@ contains
929931
if (viscous) then
930932
do fluid_idx = 1, num_fluids
931933
if (fluid_pp(fluid_idx)%non_newtonian) then
932-
! Non-Newtonian: compute reference viscosity at gdot = 1
933-
dynamic_viscosities(fluid_idx) = f_compute_hb_viscosity(fluid_pp(fluid_idx)%tau0, fluid_pp(fluid_idx)%K, &
934-
& fluid_pp(fluid_idx)%nn, fluid_pp(fluid_idx)%mu_min, fluid_pp(fluid_idx)%mu_max, 1._wp, &
935-
& fluid_pp(fluid_idx)%hb_m)
934+
dynamic_viscosities(fluid_idx) = 0._wp ! computed per-cell from local shear rate
936935
else if (fluid_pp(fluid_idx)%Re(1) > 0._wp) then
937936
dynamic_viscosities(fluid_idx) = 1._wp/fluid_pp(fluid_idx)%Re(1)
938937
else
@@ -943,8 +942,8 @@ contains
943942

944943
$:GPU_PARALLEL_LOOP(private='[ib_idx, encoded_ib_idx, fluid_idx, radial_vector, local_force_contribution, cell_volume, &
945944
& local_torque_contribution, dynamic_viscosity, viscous_stress_div, viscous_stress_div_1, &
946-
& viscous_stress_div_2, dx, dy, dz]', copy='[forces, torques]', copyin='[patch_ib, &
947-
& dynamic_viscosities]', collapse=3)
945+
& viscous_stress_div_2, dx, dy, dz, D_xx, D_yy, D_zz, D_xy, D_xz, D_yz, shear_rate, local_mu]', &
946+
& copy='[forces, torques]', copyin='[patch_ib, dynamic_viscosities]', collapse=3)
948947
do i = 0, m
949948
do j = 0, n
950949
do k = 0, p
@@ -986,11 +985,23 @@ contains
986985
! get the viscous stress and add its contribution if that is considered
987986
if (viscous) then
988987
! compute the volume-weighted local dynamic viscosity
988+
if (any_non_newtonian) then
989+
call s_compute_velocity_gradients_at_cell(q_prim_vf, i, j, k, D_xx, D_yy, D_zz, D_xy, D_xz, D_yz)
990+
shear_rate = f_compute_shear_rate_from_components(D_xx, D_yy, D_zz, D_xy, D_xz, D_yz)
991+
end if
989992
dynamic_viscosity = 0._wp
990993
do fluid_idx = 1, num_fluids
991-
! local dynamic viscosity is the dynamic viscosity of the fluid times alpha of the fluid
992-
dynamic_viscosity = dynamic_viscosity + (q_prim_vf(fluid_idx + eqn_idx%adv%beg - 1)%sf(i, j, &
993-
& k)*dynamic_viscosities(fluid_idx))
994+
if (fluid_pp(fluid_idx)%non_newtonian) then
995+
local_mu = f_compute_hb_viscosity(fluid_pp(fluid_idx)%tau0, fluid_pp(fluid_idx)%K, &
996+
& fluid_pp(fluid_idx)%nn, fluid_pp(fluid_idx)%mu_min, &
997+
& fluid_pp(fluid_idx)%mu_max, shear_rate, &
998+
& fluid_pp(fluid_idx)%hb_m)
999+
dynamic_viscosity = dynamic_viscosity + q_prim_vf(fluid_idx + eqn_idx%adv%beg - 1)%sf(i, j, &
1000+
& k)*local_mu
1001+
else
1002+
dynamic_viscosity = dynamic_viscosity + q_prim_vf(fluid_idx + eqn_idx%adv%beg - 1)%sf(i, j, &
1003+
& k)*dynamic_viscosities(fluid_idx)
1004+
end if
9941005
end do
9951006

9961007
! get the linear force components first

0 commit comments

Comments
 (0)