Skip to content
Snippets Groups Projects
Commit 024a1aa0 authored by Evgeny Mortikov's avatar Evgeny Mortikov
Browse files

Merge branch 'Merge2Main' into 'main'

comment fixes

See merge request inmcm60_pbl/inmcm60_sfx!14
parents f6d9f3ae a63d28cd
No related branches found
No related tags found
No related merge requests found
...@@ -348,7 +348,7 @@ OPTIMIZE_OUTPUT_SLICE = NO ...@@ -348,7 +348,7 @@ OPTIMIZE_OUTPUT_SLICE = NO
# #
# Note see also the list of default file extension mappings. # Note see also the list of default file extension mappings.
EXTENSION_MAPPING = cu=c++ EXTENSION_MAPPING = cu=c++ f=FortranFixed f90=FortranFree F90=FortranFree
# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
# according to the Markdown format, which allows for more readable # according to the Markdown format, which allows for more readable
......
!> @brief surface flux model common subroutines
module sfx_common module sfx_common
!> @brief surface flux model common subroutines
public public
contains contains
! ---------------------------------------------------------------------------- !> @brief string to int conversion
elemental subroutine str2int(int, str, stat) elemental subroutine str2int(int, str, stat)
!> @brief string to int conversion
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
implicit none implicit none
integer, intent(out) :: int integer, intent(out) :: int
...@@ -19,9 +18,9 @@ contains ...@@ -19,9 +18,9 @@ contains
end subroutine str2int end subroutine str2int
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
! ----------------------------------------------------------------------------
!> @brief check if value is finite
elemental function is_finite(value) elemental function is_finite(value)
!> @brief check if value is finite
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
use ieee_arithmetic use ieee_arithmetic
implicit none implicit none
......
!> @brief surface flux model module data
module sfx_data module sfx_data
!> @brief surface flux model module data
! modules used ! modules used
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
...@@ -20,62 +20,62 @@ module sfx_data ...@@ -20,62 +20,62 @@ module sfx_data
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
!> @brief meteorological input for surface flux calculation
type, public :: meteoDataType type, public :: meteoDataType
!> @brief meteorological input for surface flux calculation
real :: h !< constant flux layer height [m]
real :: h !> constant flux layer height [m] real :: U !< abs(wind speed) at 'h' [m/s]
real :: U !> abs(wind speed) at 'h' [m/s] real :: dT !< difference between potential temperature at 'h' and at surface [K]
real :: dT !> difference between potential temperature at 'h' and at surface [K] real :: Tsemi !< semi-sum of potential temperature at 'h' and at surface [K]
real :: Tsemi !> semi-sum of potential temperature at 'h' and at surface [K] real :: dQ !< difference between humidity at 'h' and at surface [g/g]
real :: dQ !> difference between humidity at 'h' and at surface [g/g] real :: z0_m !< surface aerodynamic roughness (should be < 0 for water bodies surface)
real :: z0_m !> surface aerodynamic roughness (should be < 0 for water bodies surface)
end type end type
!> @brief meteorological input for surface flux calculation
!> &details using arrays as input
type, public :: meteoDataVecType type, public :: meteoDataVecType
!> @brief meteorological input for surface flux calculation
!> &details using arrays as input real, allocatable :: h(:) !< constant flux layer height [m]
real, allocatable :: U(:) !< abs(wind speed) at 'h' [m/s]
real, allocatable :: h(:) !> constant flux layer height [m] real, allocatable :: dT(:) !< difference between potential temperature at 'h' and at surface [K]
real, allocatable :: U(:) !> abs(wind speed) at 'h' [m/s] real, allocatable :: Tsemi(:) !< semi-sum of potential temperature at 'h' and at surface [K]
real, allocatable :: dT(:) !> difference between potential temperature at 'h' and at surface [K] real, allocatable :: dQ(:) !< difference between humidity at 'h' and at surface [g/g]
real, allocatable :: Tsemi(:) !> semi-sum of potential temperature at 'h' and at surface [K] real, allocatable :: z0_m(:) !< surface aerodynamic roughness (should be < 0 for water bodies surface)
real, allocatable :: dQ(:) !> difference between humidity at 'h' and at surface [g/g]
real, allocatable :: z0_m(:) !> surface aerodynamic roughness (should be < 0 for water bodies surface)
end type end type
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
!> @brief surface flux output data
type, public :: sfxDataType type, public :: sfxDataType
!> @brief surface flux output data
real :: zeta !< = z/L [n/d]
real :: zeta !> = z/L [n/d] real :: Rib !< bulk Richardson number [n/d]
real :: Rib !> bulk Richardson number [n/d] real :: Re !< Reynolds number [n/d]
real :: Re !> Reynolds number [n/d] real :: B !< = log(z0_m / z0_h) [n/d]
real :: B !> = log(z0_m / z0_h) [n/d] real :: z0_m !< aerodynamic roughness [m]
real :: z0_m !> aerodynamic roughness [m] real :: z0_t !< thermal roughness [m]
real :: z0_t !> thermal roughness [m] real :: Rib_conv_lim !< Ri-bulk convection critical value [n/d]
real :: Rib_conv_lim !> Ri-bulk convection critical value [n/d] real :: Cm !< transfer coefficient for momentum [n/d]
real :: Cm !> transfer coefficient for momentum [n/d] real :: Ct !< transfer coefficient for heat [n/d]
real :: Ct !> transfer coefficient for heat [n/d] real :: Km !< eddy viscosity coeff. at h [m^2/s]
real :: Km !> eddy viscosity coeff. at h [m^2/s] real :: Pr_t_inv !< inverse turbulent Prandtl number at h [n/d]
real :: Pr_t_inv !> inverse turbulent Prandtl number at h [n/d]
end type end type
!> @brief surface flux output data
!> &details using arrays as output
type, public :: sfxDataVecType type, public :: sfxDataVecType
!> @brief surface flux output data
!> &details using arrays as output real, allocatable :: zeta(:) !< = z/L [n/d]
real, allocatable :: Rib(:) !< bulk Richardson number [n/d]
real, allocatable :: zeta(:) !> = z/L [n/d] real, allocatable :: Re(:) !< Reynolds number [n/d]
real, allocatable :: Rib(:) !> bulk Richardson number [n/d] real, allocatable :: B(:) !< = log(z0_m / z0_h) [n/d]
real, allocatable :: Re(:) !> Reynolds number [n/d] real, allocatable :: z0_m(:) !< aerodynamic roughness [m]
real, allocatable :: B(:) !> = log(z0_m / z0_h) [n/d] real, allocatable :: z0_t(:) !< thermal roughness [m]
real, allocatable :: z0_m(:) !> aerodynamic roughness [m] real, allocatable :: Rib_conv_lim(:) !< Ri-bulk convection critical value [n/d]
real, allocatable :: z0_t(:) !> thermal roughness [m] real, allocatable :: Cm(:) !< transfer coefficient for momentum [n/d]
real, allocatable :: Rib_conv_lim(:) !> Ri-bulk convection critical value [n/d] real, allocatable :: Ct(:) !< transfer coefficient for heat [n/d]
real, allocatable :: Cm(:) !> transfer coefficient for momentum [n/d] real, allocatable :: Km(:) !< eddy viscosity coeff. at h [m^2/s]
real, allocatable :: Ct(:) !> transfer coefficient for heat [n/d] real, allocatable :: Pr_t_inv(:) !< inverse turbulent Prandtl number at h [n/d]
real, allocatable :: Km(:) !> eddy viscosity coeff. at h [m^2/s]
real, allocatable :: Pr_t_inv(:) !> inverse turbulent Prandtl number at h [n/d]
end type end type
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
...@@ -142,8 +142,8 @@ contains ...@@ -142,8 +142,8 @@ contains
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
!> @brief deallocate surface fluxes data vector
subroutine deallocate_sfx_vec(sfx) subroutine deallocate_sfx_vec(sfx)
!> @brief deallocate surface fluxes data vector
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
type (sfxDataVecType), intent(inout) :: sfx type (sfxDataVecType), intent(inout) :: sfx
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
...@@ -164,8 +164,8 @@ contains ...@@ -164,8 +164,8 @@ contains
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
!> @brief helper subroutine for copying data in sfxDataVecType
subroutine push_sfx_data(sfx, sfx_cell, idx) subroutine push_sfx_data(sfx, sfx_cell, idx)
!> @brief helper subroutine for copying data in sfxDataVecType
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
type (sfxDataVecType), intent(inout) :: sfx type (sfxDataVecType), intent(inout) :: sfx
......
#include "../includeF/sfx_def.fi" #include "../includeF/sfx_def.fi"
module sfx_esm module sfx_esm
!> @brief main Earth System Model surface flux module !< @brief main Earth System Model surface flux module
! modules used ! modules used
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
...@@ -30,8 +30,8 @@ module sfx_esm ...@@ -30,8 +30,8 @@ module sfx_esm
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
type, public :: numericsType type, public :: numericsType
integer :: maxiters_convection = 10 !> maximum (actual) number of iterations in convection integer :: maxiters_convection = 10 !< maximum (actual) number of iterations in convection
integer :: maxiters_charnock = 10 !> maximum (actual) number of iterations in charnock roughness integer :: maxiters_charnock = 10 !< maximum (actual) number of iterations in charnock roughness
end type end type
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
...@@ -39,8 +39,8 @@ contains ...@@ -39,8 +39,8 @@ contains
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
subroutine get_surface_fluxes_vec(sfx, meteo, numerics, n) subroutine get_surface_fluxes_vec(sfx, meteo, numerics, n)
!> @brief surface flux calculation for array data !< @brief surface flux calculation for array data
!> @details contains C/C++ & CUDA interface !< @details contains C/C++ & CUDA interface
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
type (sfxDataVecType), intent(inout) :: sfx type (sfxDataVecType), intent(inout) :: sfx
...@@ -88,8 +88,8 @@ contains ...@@ -88,8 +88,8 @@ contains
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
subroutine get_surface_fluxes(sfx, meteo, numerics) subroutine get_surface_fluxes(sfx, meteo, numerics)
!> @brief surface flux calculation for single cell !< @brief surface flux calculation for single cell
!> @details contains C/C++ interface !< @details contains C/C++ interface
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
#ifdef SFX_CHECK_NAN #ifdef SFX_CHECK_NAN
use ieee_arithmetic use ieee_arithmetic
...@@ -103,43 +103,43 @@ contains ...@@ -103,43 +103,43 @@ contains
! --- meteo derived datatype name shadowing ! --- meteo derived datatype name shadowing
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real :: h !> constant flux layer height [m] real :: h !< constant flux layer height [m]
real :: U !> abs(wind speed) at 'h' [m/s] real :: U !< abs(wind speed) at 'h' [m/s]
real :: dT !> difference between potential temperature at 'h' and at surface [K] real :: dT !< difference between potential temperature at 'h' and at surface [K]
real :: Tsemi !> semi-sum of potential temperature at 'h' and at surface [K] real :: Tsemi !< semi-sum of potential temperature at 'h' and at surface [K]
real :: dQ !> difference between humidity at 'h' and at surface [g/g] real :: dQ !< difference between humidity at 'h' and at surface [g/g]
real :: z0_m !> surface aerodynamic roughness (should be < 0 for water bodies surface) real :: z0_m !< surface aerodynamic roughness (should be < 0 for water bodies surface)
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
! --- local variables ! --- local variables
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real z0_t !> thermal roughness [m] real z0_t !< thermal roughness [m]
real B !> = ln(z0_m / z0_t) [n/d] real B !< = ln(z0_m / z0_t) [n/d]
real h0_m, h0_t !> = h / z0_m, h / z0_h [n/d] real h0_m, h0_t !< = h / z0_m, h / z0_h [n/d]
real u_dyn0 !> dynamic velocity in neutral conditions [m/s] real u_dyn0 !< dynamic velocity in neutral conditions [m/s]
real Re !> roughness Reynolds number = u_dyn0 * z0_m / nu [n/d] real Re !< roughness Reynolds number = u_dyn0 * z0_m / nu [n/d]
real zeta !> = z/L [n/d] real zeta !< = z/L [n/d]
real Rib !> bulk Richardson number real Rib !< bulk Richardson number
real zeta_conv_lim !> z/L critical value for matching free convection limit [n/d] real zeta_conv_lim !< z/L critical value for matching free convection limit [n/d]
real Rib_conv_lim !> Ri-bulk critical value for matching free convection limit [n/d] real Rib_conv_lim !< Ri-bulk critical value for matching free convection limit [n/d]
real f_m_conv_lim !> stability function (momentum) value in free convection limit [n/d] real f_m_conv_lim !< stability function (momentum) value in free convection limit [n/d]
real f_h_conv_lim !> stability function (heat) value in free convection limit [n/d] real f_h_conv_lim !< stability function (heat) value in free convection limit [n/d]
real psi_m, psi_h !> universal functions (momentum) & (heat) [n/d] real psi_m, psi_h !< universal functions (momentum) & (heat) [n/d]
real phi_m, phi_h !> stability functions (momentum) & (heat) [n/d] real phi_m, phi_h !< stability functions (momentum) & (heat) [n/d]
real Km !> eddy viscosity coeff. at h [m^2/s] real Km !< eddy viscosity coeff. at h [m^2/s]
real Pr_t_inv !> invese Prandt number [n/d] real Pr_t_inv !< invese Prandt number [n/d]
real Cm, Ct !> transfer coeff. for (momentum) & (heat) [n/d] real Cm, Ct !< transfer coeff. for (momentum) & (heat) [n/d]
integer surface_type !> surface type = (ocean || land) integer surface_type !< surface type = (ocean || land)
real fval !> just a shortcut for partial calculations real fval !< just a shortcut for partial calculations
#ifdef SFX_CHECK_NAN #ifdef SFX_CHECK_NAN
real NaN real NaN
...@@ -287,12 +287,12 @@ contains ...@@ -287,12 +287,12 @@ contains
! universal functions ! universal functions
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
subroutine get_psi_neutral(psi_m, psi_h, h0_m, h0_t, B) subroutine get_psi_neutral(psi_m, psi_h, h0_m, h0_t, B)
!> @brief universal functions (momentum) & (heat): neutral case !< @brief universal functions (momentum) & (heat): neutral case
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real, intent(out) :: psi_m, psi_h !> universal functions real, intent(out) :: psi_m, psi_h !< universal functions
real, intent(in) :: h0_m, h0_t !> = z/z0_m, z/z0_h real, intent(in) :: h0_m, h0_t !< = z/z0_m, z/z0_h
real, intent(in) :: B !> = log(z0_m / z0_h) real, intent(in) :: B !< = log(z0_m / z0_h)
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
psi_m = log(h0_m) psi_m = log(h0_m)
...@@ -303,14 +303,14 @@ contains ...@@ -303,14 +303,14 @@ contains
end subroutine end subroutine
subroutine get_psi_stable(psi_m, psi_h, zeta, Rib, h0_m, h0_t, B) subroutine get_psi_stable(psi_m, psi_h, zeta, Rib, h0_m, h0_t, B)
!> @brief universal functions (momentum) & (heat): stable case !< @brief universal functions (momentum) & (heat): stable case
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real, intent(out) :: psi_m, psi_h !> universal functions [n/d] real, intent(out) :: psi_m, psi_h !< universal functions [n/d]
real, intent(out) :: zeta !> = z/L [n/d] real, intent(out) :: zeta !< = z/L [n/d]
real, intent(in) :: Rib !> bulk Richardson number [n/d] real, intent(in) :: Rib !< bulk Richardson number [n/d]
real, intent(in) :: h0_m, h0_t !> = z/z0_m, z/z0_h [n/d] real, intent(in) :: h0_m, h0_t !< = z/z0_m, z/z0_h [n/d]
real, intent(in) :: B !> = log(z0_m / z0_h) [n/d] real, intent(in) :: B !< = log(z0_m / z0_h) [n/d]
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
! --- local variables ! --- local variables
...@@ -336,15 +336,15 @@ contains ...@@ -336,15 +336,15 @@ contains
end subroutine end subroutine
subroutine get_psi_semi_convection(psi_m, psi_h, zeta, Rib, h0_m, h0_t, B, maxiters) subroutine get_psi_semi_convection(psi_m, psi_h, zeta, Rib, h0_m, h0_t, B, maxiters)
!> @brief universal functions (momentum) & (heat): semi-strong convection case !< @brief universal functions (momentum) & (heat): semi-strong convection case
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real, intent(out) :: psi_m, psi_h !> universal functions [n/d] real, intent(out) :: psi_m, psi_h !< universal functions [n/d]
real, intent(out) :: zeta !> = z/L [n/d] real, intent(out) :: zeta !< = z/L [n/d]
real, intent(in) :: Rib !> bulk Richardson number [n/d] real, intent(in) :: Rib !< bulk Richardson number [n/d]
real, intent(in) :: h0_m, h0_t !> = z/z0_m, z/z0_h [n/d] real, intent(in) :: h0_m, h0_t !< = z/z0_m, z/z0_h [n/d]
real, intent(in) :: B !> = log(z0_m / z0_h) [n/d] real, intent(in) :: B !< = log(z0_m / z0_h) [n/d]
integer, intent(in) :: maxiters !> maximum number of iterations integer, intent(in) :: maxiters !< maximum number of iterations
! --- local variables ! --- local variables
real :: zeta0_m, zeta0_h real :: zeta0_m, zeta0_h
...@@ -388,18 +388,18 @@ contains ...@@ -388,18 +388,18 @@ contains
subroutine get_psi_convection(psi_m, psi_h, zeta, Rib, & subroutine get_psi_convection(psi_m, psi_h, zeta, Rib, &
zeta_conv_lim, f_m_conv_lim, f_h_conv_lim, & zeta_conv_lim, f_m_conv_lim, f_h_conv_lim, &
h0_m, h0_t, B, maxiters) h0_m, h0_t, B, maxiters)
!> @brief universal functions (momentum) & (heat): fully convective case !< @brief universal functions (momentum) & (heat): fully convective case
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real, intent(out) :: psi_m, psi_h !> universal functions [n/d] real, intent(out) :: psi_m, psi_h !< universal functions [n/d]
real, intent(out) :: zeta !> = z/L [n/d] real, intent(out) :: zeta !< = z/L [n/d]
real, intent(in) :: Rib !> bulk Richardson number [n/d] real, intent(in) :: Rib !< bulk Richardson number [n/d]
real, intent(in) :: h0_m, h0_t !> = z/z0_m, z/z0_h [n/d] real, intent(in) :: h0_m, h0_t !< = z/z0_m, z/z0_h [n/d]
real, intent(in) :: B !> = log(z0_m / z0_h) [n/d] real, intent(in) :: B !< = log(z0_m / z0_h) [n/d]
integer, intent(in) :: maxiters !> maximum number of iterations integer, intent(in) :: maxiters !< maximum number of iterations
real, intent(in) :: zeta_conv_lim !> convective limit zeta real, intent(in) :: zeta_conv_lim !< convective limit zeta
real, intent(in) :: f_m_conv_lim, f_h_conv_lim !> universal function shortcuts in limiting case real, intent(in) :: f_m_conv_lim, f_h_conv_lim !< universal function shortcuts in limiting case
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
! --- local variables ! --- local variables
...@@ -447,12 +447,12 @@ contains ...@@ -447,12 +447,12 @@ contains
subroutine get_convection_lim(zeta_lim, Rib_lim, f_m_lim, f_h_lim, & subroutine get_convection_lim(zeta_lim, Rib_lim, f_m_lim, f_h_lim, &
h0_m, h0_t, B) h0_m, h0_t, B)
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real, intent(out) :: zeta_lim !> limiting value of z/L real, intent(out) :: zeta_lim !< limiting value of z/L
real, intent(out) :: Rib_lim !> limiting value of Ri-bulk real, intent(out) :: Rib_lim !< limiting value of Ri-bulk
real, intent(out) :: f_m_lim, f_h_lim !> limiting values of universal functions shortcuts real, intent(out) :: f_m_lim, f_h_lim !< limiting values of universal functions shortcuts
real, intent(in) :: h0_m, h0_t !> = z/z0_m, z/z0_h [n/d] real, intent(in) :: h0_m, h0_t !< = z/z0_m, z/z0_h [n/d]
real, intent(in) :: B !> = log(z0_m / z0_h) [n/d] real, intent(in) :: B !< = log(z0_m / z0_h) [n/d]
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
! --- local variables ! --- local variables
......
module sfx_esm_param module sfx_esm_param
!> @brief ESM surface flux model parameters !< @brief ESM surface flux model parameters
!> @details all in SI units !< @details all in SI units
! modules used ! modules used
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
...@@ -13,23 +13,23 @@ module sfx_esm_param ...@@ -13,23 +13,23 @@ module sfx_esm_param
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
!> von Karman constant [n/d] !< von Karman constant [n/d]
real, parameter :: kappa = 0.40 real, parameter :: kappa = 0.40
!> inverse Prandtl (turbulent) number in neutral conditions [n/d] !< inverse Prandtl (turbulent) number in neutral conditions [n/d]
real, parameter :: Pr_t_0_inv = 1.15 real, parameter :: Pr_t_0_inv = 1.15
!> inverse Prandtl (turbulent) number in free convection [n/d] !< inverse Prandtl (turbulent) number in free convection [n/d]
real, parameter :: Pr_t_inf_inv = 3.5 real, parameter :: Pr_t_inf_inv = 3.5
!> stability function coeff. (unstable) [= g4 & g10 in deprecated code] !< stability function coeff. (unstable) [= g4 & g10 in deprecated code]
real, parameter :: alpha_m = 16.0 real, parameter :: alpha_m = 16.0
real, parameter :: alpha_h = 16.0 real, parameter :: alpha_h = 16.0
real, parameter :: alpha_h_fix = 1.2 real, parameter :: alpha_h_fix = 1.2
!> stability function coeff. (stable) !< stability function coeff. (stable)
real, parameter :: beta_m = 4.7 real, parameter :: beta_m = 4.7
real, parameter :: beta_h = beta_m real, parameter :: beta_h = beta_m
!> --- max Ri-bulk value in stable case ( < 1 / beta_m ) !< --- max Ri-bulk value in stable case ( < 1 / beta_m )
real, parameter :: Rib_max = 0.9 / beta_m real, parameter :: Rib_max = 0.9 / beta_m
end module sfx_esm_param end module sfx_esm_param
#include "../includeF/sfx_def.fi" #include "../includeF/sfx_def.fi"
module sfx_log module sfx_log
!> @brief simple log-roughness surface flux module !< @brief simple log-roughness surface flux module
! modules used ! modules used
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
...@@ -27,7 +27,7 @@ module sfx_log ...@@ -27,7 +27,7 @@ module sfx_log
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
type, public :: numericsType type, public :: numericsType
integer :: maxiters_charnock = 10 !> maximum (actual) number of iterations in charnock roughness integer :: maxiters_charnock = 10 !< maximum (actual) number of iterations in charnock roughness
end type end type
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
...@@ -35,8 +35,8 @@ contains ...@@ -35,8 +35,8 @@ contains
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
subroutine get_surface_fluxes_vec(sfx, meteo, numerics, n) subroutine get_surface_fluxes_vec(sfx, meteo, numerics, n)
!> @brief surface flux calculation for array data !< @brief surface flux calculation for array data
!> @details contains C/C++ & CUDA interface !< @details contains C/C++ & CUDA interface
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
type (sfxDataVecType), intent(inout) :: sfx type (sfxDataVecType), intent(inout) :: sfx
...@@ -67,8 +67,8 @@ contains ...@@ -67,8 +67,8 @@ contains
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
subroutine get_surface_fluxes(sfx, meteo, numerics) subroutine get_surface_fluxes(sfx, meteo, numerics)
!> @brief surface flux calculation for single cell !< @brief surface flux calculation for single cell
!> @details contains C/C++ interface !< @details contains C/C++ interface
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
#ifdef SFX_CHECK_NAN #ifdef SFX_CHECK_NAN
use ieee_arithmetic use ieee_arithmetic
...@@ -82,34 +82,34 @@ contains ...@@ -82,34 +82,34 @@ contains
! --- meteo derived datatype name shadowing ! --- meteo derived datatype name shadowing
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real :: h !> constant flux layer height [m] real :: h !< constant flux layer height [m]
real :: U !> abs(wind speed) at 'h' [m/s] real :: U !< abs(wind speed) at 'h' [m/s]
real :: dT !> difference between potential temperature at 'h' and at surface [K] real :: dT !< difference between potential temperature at 'h' and at surface [K]
real :: Tsemi !> semi-sum of potential temperature at 'h' and at surface [K] real :: Tsemi !< semi-sum of potential temperature at 'h' and at surface [K]
real :: dQ !> difference between humidity at 'h' and at surface [g/g] real :: dQ !< difference between humidity at 'h' and at surface [g/g]
real :: z0_m !> surface aerodynamic roughness (should be < 0 for water bodies surface) real :: z0_m !< surface aerodynamic roughness (should be < 0 for water bodies surface)
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
! --- local variables ! --- local variables
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real z0_t !> thermal roughness [m] real z0_t !< thermal roughness [m]
real B !> = ln(z0_m / z0_t) [n/d] real B !< = ln(z0_m / z0_t) [n/d]
real h0_m, h0_t !> = h / z0_m, h / z0_h [n/d] real h0_m, h0_t !< = h / z0_m, h / z0_h [n/d]
real u_dyn0 !> dynamic velocity in neutral conditions [m/s] real u_dyn0 !< dynamic velocity in neutral conditions [m/s]
real Re !> roughness Reynolds number = u_dyn0 * z0_m / nu [n/d] real Re !< roughness Reynolds number = u_dyn0 * z0_m / nu [n/d]
real Rib !> bulk Richardson number real Rib !< bulk Richardson number
real psi_m, psi_h !> universal functions (momentum) & (heat) [n/d] real psi_m, psi_h !< universal functions (momentum) & (heat) [n/d]
real phi_m, phi_h !> stability functions (momentum) & (heat) [n/d] real phi_m, phi_h !< stability functions (momentum) & (heat) [n/d]
real Km !> eddy viscosity coeff. at h [m^2/s] real Km !< eddy viscosity coeff. at h [m^2/s]
real Pr_t_inv !> invese Prandt number [n/d] real Pr_t_inv !< invese Prandt number [n/d]
real Cm, Ct !> transfer coeff. for (momentum) & (heat) [n/d] real Cm, Ct !< transfer coeff. for (momentum) & (heat) [n/d]
integer surface_type !> surface type = (ocean || land) integer surface_type !< surface type = (ocean || land)
#ifdef SFX_CHECK_NAN #ifdef SFX_CHECK_NAN
...@@ -197,12 +197,12 @@ contains ...@@ -197,12 +197,12 @@ contains
! universal functions ! universal functions
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
subroutine get_psi_neutral(psi_m, psi_h, h0_m, h0_t, B) subroutine get_psi_neutral(psi_m, psi_h, h0_m, h0_t, B)
!> @brief universal functions (momentum) & (heat): neutral case !< @brief universal functions (momentum) & (heat): neutral case
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real, intent(out) :: psi_m, psi_h !> universal functions real, intent(out) :: psi_m, psi_h !< universal functions
real, intent(in) :: h0_m, h0_t !> = z/z0_m, z/z0_h real, intent(in) :: h0_m, h0_t !< = z/z0_m, z/z0_h
real, intent(in) :: B !> = log(z0_m / z0_h) real, intent(in) :: B !< = log(z0_m / z0_h)
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
psi_m = log(h0_m) psi_m = log(h0_m)
......
module sfx_log_param module sfx_log_param
!> @brief log-roughness surface flux model parameters !< @brief log-roughness surface flux model parameters
!> @details all in SI units !< @details all in SI units
! modules used ! modules used
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
...@@ -13,9 +13,9 @@ module sfx_log_param ...@@ -13,9 +13,9 @@ module sfx_log_param
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
!> von Karman constant [n/d] !< von Karman constant [n/d]
real, parameter :: kappa = 0.40 real, parameter :: kappa = 0.40
!> inverse Prandtl (turbulent) number in neutral conditions [n/d] !< inverse Prandtl (turbulent) number in neutral conditions [n/d]
real, parameter :: Pr_t_0_inv = 1.15 real, parameter :: Pr_t_0_inv = 1.15
end module sfx_log_param end module sfx_log_param
...@@ -20,31 +20,31 @@ program sfx_main ...@@ -20,31 +20,31 @@ program sfx_main
implicit none implicit none
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
!> dataset ID:
integer :: dataset_id integer :: dataset_id !< dataset ID:
character(len = 256) :: dataset_name character(len = 256) :: dataset_name
integer, parameter :: dataset_MOSAiC = 1 !> MOSAiC campaign integer, parameter :: dataset_MOSAiC = 1 !< MOSAiC campaign
integer, parameter :: dataset_IRGASON = 2 !> IRGASON data integer, parameter :: dataset_IRGASON = 2 !< IRGASON data
integer, parameter :: dataset_SHEBA = 3 !> please spell 'SHIBA' integer, parameter :: dataset_SHEBA = 3 !< please spell 'SHIBA'
integer, parameter :: dataset_USER = 4 !> used defined dataset integer, parameter :: dataset_USER = 4 !< used defined dataset
!> sfx model ID: integer :: model_id !< sfx model ID:
integer :: model_id
character(len = 256) :: model_name character(len = 256) :: model_name
integer, parameter :: model_esm = 0 !> ESM model integer, parameter :: model_esm = 0 !< ESM model
integer, parameter :: model_log = 1 !> LOG simplified model integer, parameter :: model_log = 1 !< LOG simplified model
! input/output data ! input/output data
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
type(meteoDataVecType) :: meteo !> meteorological data (input) type(meteoDataVecType) :: meteo !< meteorological data (input)
type(meteoDataType) :: meteo_cell type(meteoDataType) :: meteo_cell
type(sfxDataVecType) :: sfx !> surface fluxes (output) type(sfxDataVecType) :: sfx !< surface fluxes (output)
type(numericsType_esm) :: numerics_esm !> surface flux module (ESM) numerics parameters type(numericsType_esm) :: numerics_esm !< surface flux module (ESM) numerics parameters
type(numericsType_log) :: numerics_log !> surface flux module (LOG) numerics parameters type(numericsType_log) :: numerics_log !< surface flux module (LOG) numerics parameters
integer :: num !> number of 'cells' in input integer :: num !< number of 'cells' in input
! --- input/output filenames ! --- input/output filenames
...@@ -83,9 +83,9 @@ program sfx_main ...@@ -83,9 +83,9 @@ program sfx_main
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
!> @brief define model & dataset !< @brief define model & dataset
model_id = model_esm !> default = ESM model_id = model_esm !< default = ESM
dataset_id = dataset_MOSAiC !> default = MOSAiC dataset_id = dataset_MOSAiC !< default = MOSAiC
is_output_set = 0 is_output_set = 0
nmax = 0 nmax = 0
...@@ -175,7 +175,7 @@ program sfx_main ...@@ -175,7 +175,7 @@ program sfx_main
end do end do
!> @brief set name for specific model !< @brief set name for specific model
if (model_id == model_esm) then if (model_id == model_esm) then
model_name = "ESM" model_name = "ESM"
else if (model_id == model_log) then else if (model_id == model_log) then
...@@ -185,7 +185,7 @@ program sfx_main ...@@ -185,7 +185,7 @@ program sfx_main
stop stop
end if end if
!> @brief set name & filenames for specific dataset !< @brief set name & filenames for specific dataset
if (dataset_id == dataset_MOSAiC) then if (dataset_id == dataset_MOSAiC) then
dataset_name = 'MOSAiC' dataset_name = 'MOSAiC'
...@@ -218,7 +218,7 @@ program sfx_main ...@@ -218,7 +218,7 @@ program sfx_main
write(*, *) ' filename[OUT] = ', trim(filename_out) write(*, *) ' filename[OUT] = ', trim(filename_out)
!> @brief define number of cells !< @brief define number of cells
open(1, file= filename_in, status ='old') open(1, file= filename_in, status ='old')
status = 0 status = 0
...@@ -239,18 +239,18 @@ program sfx_main ...@@ -239,18 +239,18 @@ program sfx_main
end if end if
!> @brief allocate input & output data !< @brief allocate input & output data
call allocate_meteo_vec(meteo, num) call allocate_meteo_vec(meteo, num)
call allocate_sfx_vec(sfx, num) call allocate_sfx_vec(sfx, num)
!> @brief read input data common parameters !< @brief read input data common parameters
open(1, file = filename_in_common, status = 'old') open(1, file = filename_in_common, status = 'old')
read(1, *) meteo_cell%h, meteo_cell%z0_m read(1, *) meteo_cell%h, meteo_cell%z0_m
close(1) close(1)
!> @brief read input data !< @brief read input data
open(1, file = filename_in, status = 'old') open(1, file = filename_in, status = 'old')
do i = 1, num do i = 1, num
read(1, *) meteo_cell%U, meteo_cell%dT, meteo_cell%Tsemi, meteo_cell%dQ read(1, *) meteo_cell%U, meteo_cell%dT, meteo_cell%Tsemi, meteo_cell%dQ
...@@ -265,7 +265,7 @@ program sfx_main ...@@ -265,7 +265,7 @@ program sfx_main
close(1) close(1)
!> @brief calling flux module !< @brief calling flux module
if (model_id == model_esm) then if (model_id == model_esm) then
call get_surface_fluxes_vec_esm(sfx, meteo, numerics_esm, num) call get_surface_fluxes_vec_esm(sfx, meteo, numerics_esm, num)
else if (model_id == model_log) then else if (model_id == model_log) then
...@@ -273,7 +273,7 @@ program sfx_main ...@@ -273,7 +273,7 @@ program sfx_main
end if end if
!> @brief write output data !< @brief write output data
call write_ascii_vec11(filename_out, & call write_ascii_vec11(filename_out, &
sfx%zeta, sfx%Rib, & sfx%zeta, sfx%Rib, &
sfx%Re, sfx%B, sfx%z0_m, sfx%z0_t, & sfx%Re, sfx%B, sfx%z0_m, sfx%z0_t, &
...@@ -281,7 +281,7 @@ program sfx_main ...@@ -281,7 +281,7 @@ program sfx_main
sfx%Cm,sfx%Ct, sfx%Km, sfx%Pr_t_inv, num, '(11(f10.4,3x))', status) sfx%Cm,sfx%Ct, sfx%Km, sfx%Pr_t_inv, num, '(11(f10.4,3x))', status)
!> @brief deallocate input & output data !< @brief deallocate input & output data
call deallocate_meteo_vec(meteo) call deallocate_meteo_vec(meteo)
call deallocate_sfx_vec(sfx) call deallocate_sfx_vec(sfx)
......
module sfx_phys_const module sfx_phys_const
!> @brief general physics constants !< @brief general physics constants
!> @details all in SI units !< @details all in SI units
implicit none implicit none
public public
real, parameter :: g = 9.81 !> acceleration due to gravity [m/s^2] real, parameter :: g = 9.81 !< acceleration due to gravity [m/s^2]
real, parameter :: nu_air = 0.000015e0 !> kinematic viscosity of air [m^2/s] real, parameter :: nu_air = 0.000015e0 !< kinematic viscosity of air [m^2/s]
real, parameter :: Pr_m = 0.71 !> molecular Prandtl number (air) [n/d] real, parameter :: Pr_m = 0.71 !< molecular Prandtl number (air) [n/d]
end module sfx_phys_const end module sfx_phys_const
#include "../includeF/sfx_def.fi" #include "../includeF/sfx_def.fi"
module sfx_surface module sfx_surface
!> @brief surface roughness parameterizations !< @brief surface roughness parameterizations
! modules used ! modules used
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
...@@ -21,16 +21,16 @@ module sfx_surface ...@@ -21,16 +21,16 @@ module sfx_surface
! *: add surface type as input value ! *: add surface type as input value
integer, public, parameter :: surface_ocean = 0 !> ocean surface integer, public, parameter :: surface_ocean = 0 !< ocean surface
integer, public, parameter :: surface_land = 1 !> land surface integer, public, parameter :: surface_land = 1 !< land surface
integer, public, parameter :: surface_lake = 2 !> lake surface integer, public, parameter :: surface_lake = 2 !< lake surface
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
real, parameter, private :: kappa = 0.40 !> von Karman constant [n/d] real, parameter, private :: kappa = 0.40 !< von Karman constant [n/d]
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
!> Charnock parameters !< Charnock parameters
!> z0 = Re_visc_min * (nu / u_dyn) + gamma_c * (u_dyn^2 / g) !< z0 = Re_visc_min * (nu / u_dyn) + gamma_c * (u_dyn^2 / g)
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
real, parameter :: gamma_c = 0.0144 real, parameter :: gamma_c = 0.0144
...@@ -41,17 +41,17 @@ module sfx_surface ...@@ -41,17 +41,17 @@ module sfx_surface
real, parameter :: c2_charnock = Re_visc_min * nu_air * c1_charnock real, parameter :: c2_charnock = Re_visc_min * nu_air * c1_charnock
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
!> Re fully roughness minimum value [n/d] !< Re fully roughness minimum value [n/d]
real, parameter :: Re_rough_min = 16.3 real, parameter :: Re_rough_min = 16.3
!> roughness model coeff. [n/d] !< roughness model coeff. [n/d]
!> --- transitional mode !< --- transitional mode
!> B = log(z0_m / z0_t) = B1 * log(B3 * Re) + B2 !< B = log(z0_m / z0_t) = B1 * log(B3 * Re) + B2
real, parameter :: B1_rough = 5.0 / 6.0 real, parameter :: B1_rough = 5.0 / 6.0
real, parameter :: B2_rough = 0.45 real, parameter :: B2_rough = 0.45
real, parameter :: B3_rough = kappa * Pr_m real, parameter :: B3_rough = kappa * Pr_m
!> --- fully rough mode (Re > Re_rough_min) !< --- fully rough mode (Re > Re_rough_min)
!> B = B4 * Re^(B2) !< B = B4 * Re^(B2)
real, parameter :: B4_rough =(0.14 * (30.0**B2_rough)) * (Pr_m**0.8) real, parameter :: B4_rough =(0.14 * (30.0**B2_rough)) * (Pr_m**0.8)
real, parameter :: B_max_land = 2.0 real, parameter :: B_max_land = 2.0
...@@ -64,12 +64,12 @@ contains ...@@ -64,12 +64,12 @@ contains
! -------------------------------------------------------------------------------- ! --------------------------------------------------------------------------------
subroutine get_charnock_roughness(z0_m, u_dyn0, U, h, maxiters) subroutine get_charnock_roughness(z0_m, u_dyn0, U, h, maxiters)
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real, intent(out) :: z0_m !> aerodynamic roughness [m] real, intent(out) :: z0_m !< aerodynamic roughness [m]
real, intent(out) :: u_dyn0 !> dynamic velocity in neutral conditions [m/s] real, intent(out) :: u_dyn0 !< dynamic velocity in neutral conditions [m/s]
real, intent(in) :: h !> constant flux layer height [m] real, intent(in) :: h !< constant flux layer height [m]
real, intent(in) :: U !> abs(wind speed) [m/s] real, intent(in) :: U !< abs(wind speed) [m/s]
integer, intent(in) :: maxiters !> maximum number of iterations integer, intent(in) :: maxiters !< maximum number of iterations
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
! --- local variables ! --- local variables
...@@ -112,12 +112,12 @@ contains ...@@ -112,12 +112,12 @@ contains
subroutine get_thermal_roughness(z0_t, B, & subroutine get_thermal_roughness(z0_t, B, &
z0_m, Re, surface_type) z0_m, Re, surface_type)
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
real, intent(out) :: z0_t !> thermal roughness [m] real, intent(out) :: z0_t !< thermal roughness [m]
real, intent(out) :: B !> = log(z0_m / z0_t) [n/d] real, intent(out) :: B !< = log(z0_m / z0_t) [n/d]
real, intent(in) :: z0_m !> aerodynamic roughness [m] real, intent(in) :: z0_m !< aerodynamic roughness [m]
real, intent(in) :: Re !> roughness Reynolds number [n/d] real, intent(in) :: Re !< roughness Reynolds number [n/d]
integer, intent(in) :: surface_type !> = [ocean] || [land] || [lake] integer, intent(in) :: surface_type !< = [ocean] || [land] || [lake]
! ---------------------------------------------------------------------------- ! ----------------------------------------------------------------------------
! --- local variables ! --- local variables
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment