Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
S
sfx
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
inmcm-mirror
sfx
Commits
8f8a1523
Commit
8f8a1523
authored
3 months ago
by
Виктория Суязова
Browse files
Options
Downloads
Patches
Plain Diff
sfx_z0m_all.f90 sfx_z0t_all.f90 delited
parent
ca9e166c
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
srcF/sfx_z0m_all.f90
+0
-203
0 additions, 203 deletions
srcF/sfx_z0m_all.f90
srcF/sfx_z0t_all.f90
+0
-262
0 additions, 262 deletions
srcF/sfx_z0t_all.f90
with
0 additions
and
465 deletions
srcF/sfx_z0m_all.f90
deleted
100644 → 0
+
0
−
203
View file @
ca9e166c
module
sfx_z0m_all
!< @brief surface thermal roughness parameterizations for all type surface
use
sfx_z0m_all_surface
implicit
none
public
::
get_dynamic_roughness_all
public
::
get_dynamic_roughness_definition
integer
,
public
,
parameter
::
surface_ocean
=
0
!< ocean surface
integer
,
public
,
parameter
::
surface_land
=
1
!< land surface
integer
,
public
,
parameter
::
surface_lake
=
2
!< lake surface
integer
,
public
,
parameter
::
surface_snow
=
3
!< snow covered surface
integer
,
public
,
parameter
::
surface_forest
=
4
!< forest csurface
integer
,
public
,
parameter
::
surface_user
=
5
!< user surface
integer
,
public
,
parameter
::
z0m_ch
=
0
integer
,
public
,
parameter
::
z0m_fe
=
1
integer
,
public
,
parameter
::
z0m_ow
=
2
integer
,
public
,
parameter
::
z0m_map
=
3
integer
,
public
,
parameter
::
z0m_user
=
4
character
(
len
=
16
),
parameter
::
surface_ocean_tag
=
'ocean'
character
(
len
=
16
),
parameter
::
surface_land_tag
=
'land'
character
(
len
=
16
),
parameter
::
surface_lake_tag
=
'lake'
character
(
len
=
16
),
parameter
::
surface_snow_tag
=
'snow'
character
(
len
=
16
),
parameter
::
surface_forest_tag
=
'forest'
character
(
len
=
16
),
parameter
::
surface_user_tag
=
'user'
character
(
len
=
16
),
parameter
::
z0m_tag_ch
=
'charnock'
character
(
len
=
16
),
parameter
::
z0m_tag_fe
=
'fetch'
character
(
len
=
16
),
parameter
::
z0m_tag_ow
=
'owen'
character
(
len
=
16
),
parameter
::
z0m_tag_map
=
'map'
character
(
len
=
16
),
parameter
::
z0m_tag_user
=
'user'
integer
,
public
,
parameter
::
ocean_z0m_id
=
z0m_ch
!< ocean surface
integer
,
public
,
parameter
::
land_z0m_id
=
z0m_map
!< land surface
integer
,
public
,
parameter
::
lake_z0m_id
=
z0m_fe
!< lake surface
integer
,
public
,
parameter
::
snow_z0m_id
=
z0m_ow
!< snow covered surface
integer
,
public
,
parameter
::
forest_z0m_id
=
z0m_map
!< forest csurface
integer
,
public
,
parameter
::
usersf_z0m_id
=
z0m_map
!< user surface
contains
! surface type definition
! --------------------------------------------------------------------------------
function
get_surface_id
(
tag
)
result
(
id
)
implicit
none
character
(
len
=*
),
intent
(
in
)
::
tag
integer
::
id
id
=
-
1
if
(
trim
(
tag
)
==
trim
(
surface_ocean_tag
))
then
id
=
surface_ocean
else
if
(
trim
(
tag
)
==
trim
(
surface_land_tag
))
then
id
=
surface_land
else
if
(
trim
(
tag
)
==
trim
(
surface_lake_tag
))
then
id
=
surface_lake
else
if
(
trim
(
tag
)
==
trim
(
surface_snow_tag
))
then
id
=
surface_snow
end
if
end
function
function
get_surface_tag
(
id
)
result
(
tag
)
implicit
none
integer
::
id
character
(
len
=
:),
allocatable
::
tag
tag
=
'undefined'
if
(
id
==
surface_ocean
)
then
tag
=
surface_ocean_tag
else
if
(
id
==
surface_land
)
then
tag
=
surface_land_tag
else
if
(
id
==
surface_lake
)
then
tag
=
surface_lake_tag
else
if
(
id
==
surface_snow
)
then
tag
=
surface_snow_tag
end
if
end
function
! --------------------------------------------------------------------------------
! surface type definition
! --------------------------------------------------------------------------------
function
get_surface_z0m_id
(
tag_z0m
)
result
(
z0m_id
)
implicit
none
character
(
len
=*
),
intent
(
in
)
::
tag_z0m
integer
::
z0m_id
z0m_id
=
-
1
if
(
trim
(
tag_z0m
)
==
trim
(
z0m_tag_ch
))
then
z0m_id
=
z0m_ch
else
if
(
trim
(
tag_z0m
)
==
trim
(
z0m_tag_fe
))
then
z0m_id
=
z0m_fe
else
if
(
trim
(
tag_z0m
)
==
trim
(
z0m_tag_ow
))
then
z0m_id
=
z0m_ow
else
if
(
trim
(
tag_z0m
)
==
trim
(
z0m_tag_map
))
then
z0m_id
=
z0m_map
else
if
(
trim
(
tag_z0m
)
==
trim
(
z0m_tag_user
))
then
z0m_id
=
z0m_user
end
if
end
function
function
get_surface_z0m_tag
(
z0m_id
)
result
(
tag_z0m
)
implicit
none
integer
::
z0m_id
character
(
len
=
:),
allocatable
::
tag_z0m
tag_z0m
=
'undefined'
if
(
z0m_id
==
z0m_ch
)
then
tag_z0m
=
z0m_tag_ch
else
if
(
z0m_id
==
z0m_fe
)
then
tag_z0m
=
z0m_tag_fe
else
if
(
z0m_id
==
z0m_ow
)
then
tag_z0m
=
z0m_tag_ow
else
if
(
z0m_id
==
z0m_map
)
then
tag_z0m
=
z0m_tag_map
else
if
(
z0m_id
==
z0m_user
)
then
tag_z0m
=
z0m_tag_user
end
if
end
function
! ----------------------------------------------------------------------------
subroutine
get_dynamic_roughness_all
(
z0_m
,
u_dyn0
,
U
,
depth
,
h
,&
maxiters
,
z0m_map
,
z0m_id
)
! ----------------------------------------------------------------------------
real
,
intent
(
out
)
::
z0_m
!< aerodynamic roughness [m]
real
,
intent
(
out
)
::
u_dyn0
!< dynamic velocity in neutral conditions [m/s]
real
,
intent
(
in
)
::
U
!< abs(wind speed) [m/s]
real
,
intent
(
in
)
::
depth
!< depth [m]
real
,
intent
(
in
)
::
h
!< constant flux layer height [m]
real
,
intent
(
in
)
::
z0m_map
!< aerodynamic roughness from map [m]
integer
,
intent
(
in
)
::
maxiters
!< maximum number of iterations
integer
,
intent
(
in
)
::
z0m_id
! ---------------------------------------------------------------------------
if
(
z0m_id
==
z0m_ch
)
then
call
get_dynamic_roughness_ch
(
z0_m
,
u_dyn0
,
U
,
h
,
maxiters
)
else
if
(
z0m_id
==
z0m_fe
)
then
call
get_dynamic_roughness_fetch
(
z0_m
,
u_dyn0
,
U
,
depth
,
h
,
maxiters
)
else
if
(
z0m_id
==
z0m_ow
)
then
call
get_dynamic_roughness_ow
(
z0_m
,
u_dyn0
,
U
,
h
,
maxiters
)
else
if
(
z0m_id
==
z0m_map
)
then
call
get_dynamic_roughness_map
(
z0_m
,
u_dyn0
,
U
,
h
,
z0m_map
)
else
if
(
z0m_id
==
z0m_user
)
then
write
(
*
,
*
)
'z0m_user'
end
if
end
subroutine
! --------------------------------------------------------------------------------
! ----------------------------------------------------------------------------
subroutine
get_dynamic_roughness_definition
(
surface_type
,
ocean_z0m_id
,
land_z0m_id
,
snow_z0m_id
,
lake_z0m_id
,
&
forest_z0m_id
,
usersf_z0m_id
,
z0m_id
)
! ----------------------------------------------------------------------------
real
,
intent
(
out
)
::
z0m_id
real
,
intent
(
in
)
::
surface_type
real
,
intent
(
in
)
::
ocean_z0m_id
real
,
intent
(
in
)
::
land_z0m_id
real
,
intent
(
in
)
::
snow_z0m_id
real
,
intent
(
in
)
::
lake_z0m_id
real
,
intent
(
in
)
::
forest_z0m_id
real
,
intent
(
in
)
::
usersf_z0m_id
! ---------------------------------------------------------------------------
Write
(
*
,
*
)
'get_dynamic_roughness_definition'
if
(
surface_type
==
surface_ocean
)
then
z0m_id
=
ocean_z0m_id
else
if
(
surface_type
==
surface_land
)
then
z0m_id
=
land_z0m_id
else
if
(
surface_type
==
surface_snow
)
then
z0m_id
=
snow_z0m_id
else
if
(
surface_type
==
surface_lake
)
then
z0m_id
=
lake_z0m_id
else
if
(
surface_type
==
surface_forest
)
then
z0m_id
=
forest_z0m_id
else
if
(
surface_type
==
surface_user
)
then
z0m_id
=
usersf_z0m_id
end
if
end
subroutine
end
module
sfx_z0m_all
This diff is collapsed.
Click to expand it.
srcF/sfx_z0t_all.f90
deleted
100644 → 0
+
0
−
262
View file @
ca9e166c
module
sfx_z0t_all
!< @brief surface thermal roughness parameterizations for all type surface
use
sfx_z0t_all_surface
implicit
none
public
::
get_thermal_roughness_all
public
::
get_thermal_roughness_definition
integer
,
public
,
parameter
::
surface_ocean
=
0
!< ocean surface
integer
,
public
,
parameter
::
surface_land
=
1
!< land surface
integer
,
public
,
parameter
::
surface_lake
=
2
!< lake surface
integer
,
public
,
parameter
::
surface_snow
=
3
!< snow covered surface
integer
,
public
,
parameter
::
surface_forest
=
4
!< forest surface
integer
,
public
,
parameter
::
surface_user
=
5
!< user surface
integer
,
public
,
parameter
::
z0t_kl_water
=
0
integer
,
public
,
parameter
::
z0t_kl_land
=
1
integer
,
public
,
parameter
::
z0t_re
=
2
integer
,
public
,
parameter
::
z0t_zi
=
3
integer
,
public
,
parameter
::
z0t_ca
=
4
integer
,
public
,
parameter
::
z0t_cz
=
5
integer
,
public
,
parameter
::
z0t_br
=
6
integer
,
public
,
parameter
::
z0t_ot
=
7
integer
,
public
,
parameter
::
z0t_du
=
8
integer
,
public
,
parameter
::
z0t_zm
=
9
integer
,
public
,
parameter
::
z0t_mix
=
10
integer
,
public
,
parameter
::
z0t_user
=
11
character
(
len
=
16
),
parameter
::
surface_ocean_tag
=
'ocean'
character
(
len
=
16
),
parameter
::
surface_land_tag
=
'land'
character
(
len
=
16
),
parameter
::
surface_lake_tag
=
'lake'
character
(
len
=
16
),
parameter
::
surface_snow_tag
=
'snow'
character
(
len
=
16
),
parameter
::
surface_forest_tag
=
'forest'
character
(
len
=
16
),
parameter
::
surface_user_tag
=
'user'
character
(
len
=
16
),
parameter
::
z0t_tag_kl_water
=
'kl_water'
character
(
len
=
16
),
parameter
::
z0t_tag_kl_land
=
'kl_land'
character
(
len
=
16
),
parameter
::
z0t_tag_re
=
're'
character
(
len
=
16
),
parameter
::
z0t_tag_zi
=
'zi'
character
(
len
=
16
),
parameter
::
z0t_tag_ca
=
'ca'
character
(
len
=
16
),
parameter
::
z0t_tag_cz
=
'cz'
character
(
len
=
16
),
parameter
::
z0t_tag_br
=
'br'
character
(
len
=
16
),
parameter
::
z0t_tag_ot
=
'ot'
character
(
len
=
16
),
parameter
::
z0t_tag_du
=
'du'
character
(
len
=
16
),
parameter
::
z0t_tag_zm
=
'zm'
character
(
len
=
16
),
parameter
::
z0t_tag_mix
=
'mix'
character
(
len
=
16
),
parameter
::
z0t_tag_user
=
'zt_user'
integer
,
public
,
parameter
::
ocean_z0t_id
=
z0t_kl_water
!< ocean surface
integer
,
public
,
parameter
::
land_z0t_id
=
z0t_kl_land
!< land surface
integer
,
public
,
parameter
::
lake_z0t_id
=
z0t_re
!< lake surface
integer
,
public
,
parameter
::
snow_z0t_id
=
z0t_ca
!< snow covered surface
integer
,
public
,
parameter
::
forest_z0t_id
=
z0t_du
!< forest csurface
integer
,
public
,
parameter
::
usersf_z0t_id
=
z0t_mix
!< user surface
contains
! surface type definition
! --------------------------------------------------------------------------------
function
get_surface_id
(
tag
)
result
(
id
)
implicit
none
character
(
len
=*
),
intent
(
in
)
::
tag
integer
::
id
id
=
-
1
if
(
trim
(
tag
)
==
trim
(
surface_ocean_tag
))
then
id
=
surface_ocean
else
if
(
trim
(
tag
)
==
trim
(
surface_land_tag
))
then
id
=
surface_land
else
if
(
trim
(
tag
)
==
trim
(
surface_lake_tag
))
then
id
=
surface_lake
else
if
(
trim
(
tag
)
==
trim
(
surface_snow_tag
))
then
id
=
surface_snow
end
if
end
function
function
get_surface_tag
(
id
)
result
(
tag
)
implicit
none
integer
::
id
character
(
len
=
:),
allocatable
::
tag
tag
=
'undefined'
if
(
id
==
surface_ocean
)
then
tag
=
surface_ocean_tag
else
if
(
id
==
surface_land
)
then
tag
=
surface_land_tag
else
if
(
id
==
surface_lake
)
then
tag
=
surface_lake_tag
else
if
(
id
==
surface_snow
)
then
tag
=
surface_snow_tag
end
if
end
function
! --------------------------------------------------------------------------------
! surface type definition
! --------------------------------------------------------------------------------
function
get_surface_z0t_id
(
tag_z0t
)
result
(
z0t_id
)
implicit
none
character
(
len
=*
),
intent
(
in
)
::
tag_z0t
integer
::
z0t_id
z0t_id
=
-
1
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_kl_water
))
then
z0t_id
=
z0t_kl_water
else
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_kl_land
))
then
z0t_id
=
z0t_kl_land
else
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_re
))
then
z0t_id
=
z0t_re
else
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_zi
))
then
z0t_id
=
z0t_zi
else
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_ca
))
then
z0t_id
=
z0t_ca
else
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_cz
))
then
z0t_id
=
z0t_cz
else
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_br
))
then
z0t_id
=
z0t_br
else
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_ot
))
then
z0t_id
=
z0t_ot
else
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_du
))
then
z0t_id
=
z0t_du
else
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_zm
))
then
z0t_id
=
z0t_zm
else
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_mix
))
then
z0t_id
=
z0t_mix
else
if
(
trim
(
tag_z0t
)
==
trim
(
z0t_tag_user
))
then
z0t_id
=
z0t_user
end
if
end
function
function
get_surface_z0t_tag
(
z0t_id
)
result
(
tag_z0t
)
implicit
none
integer
::
z0t_id
character
(
len
=
:),
allocatable
::
tag_z0t
tag_z0t
=
'undefined'
if
(
z0t_id
==
z0t_kl_water
)
then
tag_z0t
=
z0t_tag_kl_water
else
if
(
z0t_id
==
z0t_kl_land
)
then
tag_z0t
=
z0t_tag_kl_land
else
if
(
z0t_id
==
z0t_re
)
then
tag_z0t
=
z0t_tag_re
else
if
(
z0t_id
==
z0t_zi
)
then
tag_z0t
=
z0t_tag_zi
else
if
(
z0t_id
==
z0t_ca
)
then
tag_z0t
=
z0t_tag_ca
else
if
(
z0t_id
==
z0t_cz
)
then
tag_z0t
=
z0t_tag_cz
else
if
(
z0t_id
==
z0t_br
)
then
tag_z0t
=
z0t_tag_br
else
if
(
z0t_id
==
z0t_ot
)
then
tag_z0t
=
z0t_tag_ot
else
if
(
z0t_id
==
z0t_du
)
then
tag_z0t
=
z0t_tag_du
else
if
(
z0t_id
==
z0t_zm
)
then
tag_z0t
=
z0t_tag_zm
else
if
(
z0t_id
==
z0t_mix
)
then
tag_z0t
=
z0t_tag_mix
else
if
(
z0t_id
==
z0t_user
)
then
tag_z0t
=
z0t_tag_user
end
if
end
function
! ----------------------------------------------------------------------------
subroutine
get_thermal_roughness_all
(
z0_t
,
B
,
&
z0_m
,
Re
,
u_dyn
,
Czm
,
LAI
,
z0t_id
)
! ----------------------------------------------------------------------------
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]
real
,
intent
(
in
)
::
LAI
!< leaf-area index
real
,
intent
(
in
)
::
u_dyn
!< dynamic velocity [m/s]
real
,
intent
(
in
)
::
Czm
!< proportionality coefficient z0_t =Czm*z0_m
integer
,
intent
(
in
)
::
z0t_id
! ---------------------------------------------------------------------------
if
(
z0t_id
==
z0t_kl_water
)
then
call
get_thermal_roughness_kl_water
(
z0_t
,
B
,
z0_m
,
Re
)
else
if
(
z0t_id
==
z0t_kl_land
)
then
call
get_thermal_roughness_kl_land
(
z0_t
,
B
,
z0_m
,
Re
)
else
if
(
z0t_id
==
z0t_re
)
then
call
get_thermal_roughness_re
(
z0_t
,
B
,
z0_m
,
Re
)
else
if
(
z0t_id
==
z0t_zi
)
then
call
get_thermal_roughness_zi
(
z0_t
,
B
,
z0_m
,
Re
)
else
if
(
z0t_id
==
z0t_ca
)
then
call
get_thermal_roughness_ca
(
z0_t
,
B
,
z0_m
,
Re
)
else
if
(
z0t_id
==
z0t_cz
)
then
call
get_thermal_roughness_cz
(
z0_t
,
B
,
z0_m
,
Re
)
else
if
(
z0t_id
==
z0t_br
)
then
call
get_thermal_roughness_br
(
z0_t
,
B
,
z0_m
,
Re
)
else
if
(
z0t_id
==
z0t_ot
)
then
call
get_thermal_roughness_ot
(
z0_t
,
B
,
z0_m
,
Re
)
else
if
(
z0t_id
==
z0t_du
)
then
call
get_thermal_roughness_du
(
z0_t
,
B
,
z0_m
,
u_dyn
,
LAI
)
else
if
(
z0t_id
==
z0t_zm
)
then
call
get_thermal_roughness_zm
(
z0_t
,
B
,
z0_m
,
Czm
)
else
if
(
z0t_id
==
z0t_mix
)
then
call
get_thermal_roughness_mix
(
z0_t
,
B
,
z0_m
,
u_dyn
,
Re
)
else
if
(
z0t_id
==
z0t_user
)
then
write
(
*
,
*
)
'z0t_user'
end
if
write
(
*
,
*
)
z0_t
,
B
,
z0_m
,
Re
,
u_dyn
,
Czm
,
LAI
,
z0t_id
end
subroutine
! --------------------------------------------------------------------------------
! ----------------------------------------------------------------------------
subroutine
get_thermal_roughness_definition
(
surface_type
,
id_ocean
,
id_land
,
id_snow
,
id_lake
,
&
id_forest
,
id_user
,
ocean_z0t_id
,
land_z0t_id
,
lake_z0t_id
,
snow_z0t_id
,
&
forest_z0t_id
,
usersf_z0t_id
)
! ----------------------------------------------------------------------------
real
,
intent
(
out
)
::
ocean_z0t_id
real
,
intent
(
out
)
::
land_z0t_id
real
,
intent
(
out
)
::
lake_z0t_id
real
,
intent
(
out
)
::
snow_z0t_id
real
,
intent
(
out
)
::
forest_z0t_id
real
,
intent
(
out
)
::
usersf_z0t_id
real
,
intent
(
in
)
::
surface_type
real
,
intent
(
in
)
::
id_ocean
real
,
intent
(
in
)
::
id_land
real
,
intent
(
in
)
::
id_snow
real
,
intent
(
in
)
::
id_lake
real
,
intent
(
in
)
::
id_forest
real
,
intent
(
in
)
::
id_user
! ---------------------------------------------------------------------------
if
(
surface_type
==
surface_ocean
)
then
ocean_z0t_id
=
id_ocean
else
if
(
surface_type
==
surface_land
)
then
land_z0t_id
=
id_land
else
if
(
surface_type
==
surface_snow
)
then
snow_z0t_id
=
id_snow
else
if
(
surface_type
==
surface_lake
)
then
lake_z0t_id
=
id_lake
else
if
(
surface_type
==
surface_forest
)
then
forest_z0t_id
=
id_forest
else
if
(
surface_type
==
surface_user
)
then
usersf_z0t_id
=
id_user
end
if
end
subroutine
end
module
sfx_z0t_all
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment