From 019e2d0153de1eca17a882026795b24be044fd8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D1=8F=20=D0=A1?= =?UTF-8?q?=D1=83=D1=8F=D0=B7=D0=BE=D0=B2=D0=B0?= <viktoriasuazova@MacBook-Pro-Viktoria.local> Date: Sat, 14 Sep 2024 14:39:20 +0300 Subject: [PATCH] z0t_ocean snow added --- srcF/module_z0t_ocean.f90 | 125 ++++++++++++++++++++++++++++++++++++++ srcF/module_z0t_snow.f90 | 125 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 250 insertions(+) create mode 100644 srcF/module_z0t_ocean.f90 create mode 100644 srcF/module_z0t_snow.f90 diff --git a/srcF/module_z0t_ocean.f90 b/srcF/module_z0t_ocean.f90 new file mode 100644 index 0000000..bd0d6e5 --- /dev/null +++ b/srcF/module_z0t_ocean.f90 @@ -0,0 +1,125 @@ +module module_z0t_ocean + !< @brief surface thermal roughness parameterizations for ocean + + implicit none + + + public :: get_thermal_roughness_kl + public :: get_thermal_roughness_ca + public :: get_thermal_roughness_zm + public :: get_thermal_roughness_br + + + + + ! -------------------------------------------------------------------------------- + real, parameter, private :: kappa = 0.40 !< von Karman constant [n/d] + real, parameter, private :: Pr_m = 0.71 !< molecular Prandtl number (air) [n/d] + !< Re fully roughness minimum value [n/d] + real, parameter :: Re_rough_min = 16.3 + !< roughness model coeff. [n/d] + !< --- transitional mode + !< B = log(z0_m / z0_t) = B1 * log(B3 * Re) + B2 + real, parameter :: B1_rough = 5.0 / 6.0 + real, parameter :: B2_rough = 0.45 + real, parameter :: B3_rough = kappa * Pr_m + !< --- fully rough mode (Re > Re_rough_min) + !< B = B4 * Re^(B2) + real, parameter :: B4_rough =(0.14 * (30.0**B2_rough)) * (Pr_m**0.8) + + real, parameter :: B_max_ocean = 8.0 + + + contains + + + ! thermal roughness definition by Kazakov, Lykosov + ! -------------------------------------------------------------------------------- + subroutine get_thermal_roughness_kl(z0_t, B, & + z0_m, Re) + ! ---------------------------------------------------------------------------- + real, intent(out) :: z0_t !< thermal roughness [m] + real, intent(out) :: B !< = log(z0_m / z0_t) [n/d] + + real, intent(in) :: z0_m !< aerodynamic roughness [m] + real, intent(in) :: Re !< roughness Reynolds number [n/d] + ! ---------------------------------------------------------------------------- + + !--- define B = log(z0_m / z0_t) + if (Re <= Re_rough_min) then + B = B1_rough * alog(B3_rough * Re) + B2_rough + else + ! *: B4 takes into account Re value at z' ~ O(10) z0 + B = B4_rough * (Re**B2_rough) + end if + + B = min(B, B_max_ocean) + + z0_t = z0_m / exp(B) + + end subroutine + + + + ! -------------------------------------------------------------------------------- + ! thermal roughness definition by Cahill, A.T., Parlange, M.B., Albertson, J.D., 1997. + ! -------------------------------------------------------------------------------- + subroutine get_thermal_roughness_ca(z0_t, B, & + z0_m, Re) + ! ---------------------------------------------------------------------------- + real, intent(out) :: z0_t !< thermal roughness [m] + real, intent(out) :: B !< = log(z0_m / z0_t) [n/d] + + real, intent(in) :: z0_m !< aerodynamic roughness [m] + real, intent(in) :: Re !< roughness Reynolds number [n/d] + + + + + B=2.46*(Re**0.25)-3.8 !4-Cahill et al. + + ! --- define roughness [thermal] + z0_t = z0_m / exp(B) + + end subroutine + + ! -------------------------------------------------------------------------------- + ! thermal roughness definition z0_t = C*z0_m + ! -------------------------------------------------------------------------------- + subroutine get_thermal_roughness_zm(z0_t, B, & + z0_m, Czm) + ! ---------------------------------------------------------------------------- + real, intent(out) :: z0_t !< thermal roughness [m] + real, intent(out) :: B !< = log(z0_m / z0_t) [n/d] + + real, intent(in) :: z0_m !< aerodynamic roughness [m] + real, intent(in) :: Czm !< proportionality coefficient + + + + z0_t =Czm*z0_m + B=log(z0_m / z0_t) + end subroutine + ! -------------------------------------------------------------------------------- + ! thermal roughness definition by Brutsaert W., 2003. + ! -------------------------------------------------------------------------------- + subroutine get_thermal_roughness_br(z0_t, B, & + z0_m, Re) + ! ---------------------------------------------------------------------------- + real, intent(out) :: z0_t !< thermal roughness [m] + real, intent(out) :: B !< = log(z0_m / z0_t) [n/d] + + real, intent(in) :: z0_m !< aerodynamic roughness [m] + real, intent(in) :: Re !< roughness Reynolds number [n/d] + + + + + B=2.46*(Re**0.25)-2.0 !Brutsaert + + ! --- define roughness [thermal] + z0_t = z0_m / exp(B) + + end subroutine + +end module module_z0t_ocean diff --git a/srcF/module_z0t_snow.f90 b/srcF/module_z0t_snow.f90 new file mode 100644 index 0000000..a8545a9 --- /dev/null +++ b/srcF/module_z0t_snow.f90 @@ -0,0 +1,125 @@ +module module_z0t_snow + !< @brief surface thermal roughness parameterizations for snow + + implicit none + + + public :: get_thermal_roughness_kl + public :: get_thermal_roughness_ca + public :: get_thermal_roughness_zm + public :: get_thermal_roughness_br + + + + + ! -------------------------------------------------------------------------------- + real, parameter, private :: kappa = 0.40 !< von Karman constant [n/d] + real, parameter, private :: Pr_m = 0.71 !< molecular Prandtl number (air) [n/d] + !< Re fully roughness minimum value [n/d] + real, parameter :: Re_rough_min = 16.3 + !< roughness model coeff. [n/d] + !< --- transitional mode + !< B = log(z0_m / z0_t) = B1 * log(B3 * Re) + B2 + real, parameter :: B1_rough = 5.0 / 6.0 + real, parameter :: B2_rough = 0.45 + real, parameter :: B3_rough = kappa * Pr_m + !< --- fully rough mode (Re > Re_rough_min) + !< B = B4 * Re^(B2) + real, parameter :: B4_rough =(0.14 * (30.0**B2_rough)) * (Pr_m**0.8) + + real, parameter :: B_max_snow = 8.0 + + + contains + + + ! thermal roughness definition by Kazakov, Lykosov + ! -------------------------------------------------------------------------------- + subroutine get_thermal_roughness_kl(z0_t, B, & + z0_m, Re) + ! ---------------------------------------------------------------------------- + real, intent(out) :: z0_t !< thermal roughness [m] + real, intent(out) :: B !< = log(z0_m / z0_t) [n/d] + + real, intent(in) :: z0_m !< aerodynamic roughness [m] + real, intent(in) :: Re !< roughness Reynolds number [n/d] + ! ---------------------------------------------------------------------------- + + !--- define B = log(z0_m / z0_t) + if (Re <= Re_rough_min) then + B = B1_rough * alog(B3_rough * Re) + B2_rough + else + ! *: B4 takes into account Re value at z' ~ O(10) z0 + B = B4_rough * (Re**B2_rough) + end if + + B = min(B, B_max_snow) + + z0_t = z0_m / exp(B) + + end subroutine + + + + ! -------------------------------------------------------------------------------- + ! thermal roughness definition by Cahill, A.T., Parlange, M.B., Albertson, J.D., 1997. + ! -------------------------------------------------------------------------------- + subroutine get_thermal_roughness_ca(z0_t, B, & + z0_m, Re) + ! ---------------------------------------------------------------------------- + real, intent(out) :: z0_t !< thermal roughness [m] + real, intent(out) :: B !< = log(z0_m / z0_t) [n/d] + + real, intent(in) :: z0_m !< aerodynamic roughness [m] + real, intent(in) :: Re !< roughness Reynolds number [n/d] + + + + + B=2.46*(Re**0.25)-3.8 !4-Cahill et al. + + ! --- define roughness [thermal] + z0_t = z0_m / exp(B) + + end subroutine + + ! -------------------------------------------------------------------------------- + ! thermal roughness definition z0_t = C*z0_m + ! -------------------------------------------------------------------------------- + subroutine get_thermal_roughness_zm(z0_t, B, & + z0_m, Czm) + ! ---------------------------------------------------------------------------- + real, intent(out) :: z0_t !< thermal roughness [m] + real, intent(out) :: B !< = log(z0_m / z0_t) [n/d] + + real, intent(in) :: z0_m !< aerodynamic roughness [m] + real, intent(in) :: Czm !< proportionality coefficient + + + + z0_t =Czm*z0_m + B=log(z0_m / z0_t) + end subroutine + ! -------------------------------------------------------------------------------- + ! thermal roughness definition by Brutsaert W., 2003. + ! -------------------------------------------------------------------------------- + subroutine get_thermal_roughness_br(z0_t, B, & + z0_m, Re) + ! ---------------------------------------------------------------------------- + real, intent(out) :: z0_t !< thermal roughness [m] + real, intent(out) :: B !< = log(z0_m / z0_t) [n/d] + + real, intent(in) :: z0_m !< aerodynamic roughness [m] + real, intent(in) :: Re !< roughness Reynolds number [n/d] + + + + + B=2.46*(Re**0.25)-2.0 !Brutsaert + + ! --- define roughness [thermal] + z0_t = z0_m / exp(B) + + end subroutine + +end module module_z0t_snow -- GitLab