26 implicit none ;
private 28 #include <MOM_memory.h> 45 character(len=40) :: &
49 real allocable_,
dimension(NKMEM_) :: slayer
50 real allocable_,
dimension(NK_INTERFACE_) :: sinterface
51 integer :: direction = 1
63 real allocable_,
dimension(NK_INTERFACE_) :: &
69 integer :: nk_rho_varies = 0
92 #include "version_variable.h" 94 character(len=16) :: mdl =
'MOM_verticalGrid' 96 if (
associated(gv))
call mom_error(fatal, &
97 'verticalGridInit: called with an associated GV pointer.')
102 "Parameters providing information about the vertical grid.")
103 call get_param(param_file, mdl,
"G_EARTH", gv%g_Earth, &
104 "The gravitational acceleration of the Earth.", &
105 units=
"m s-2", default = 9.80)
106 call get_param(param_file, mdl,
"RHO_0", gv%Rho0, &
107 "The mean ocean density used with BOUSSINESQ true to \n"//&
108 "calculate accelerations and the mass for conservation \n"//&
109 "properties, or with BOUSSINSEQ false to convert some \n"//&
110 "parameters from vertical units of m to kg m-2.", &
111 units=
"kg m-3", default=1035.0)
112 call get_param(param_file, mdl,
"BOUSSINESQ", gv%Boussinesq, &
113 "If true, make the Boussinesq approximation.", default=.true.)
114 call get_param(param_file, mdl,
"ANGSTROM", gv%Angstrom_z, &
115 "The minumum layer thickness, usually one-Angstrom.", &
116 units=
"m", default=1.0e-10)
117 if (.not.gv%Boussinesq)
then 118 call get_param(param_file, mdl,
"H_TO_KG_M2", gv%H_to_kg_m2,&
119 "A constant that translates thicknesses from the model's \n"//&
120 "internal units of thickness to kg m-2.", units=
"kg m-2 H-1", &
123 call get_param(param_file, mdl,
"H_TO_M", gv%H_to_m, &
124 "A constant that translates the model's internal \n"//&
125 "units of thickness into m.", units=
"m H-1", default=1.0)
127 #ifdef STATIC_MEMORY_ 129 call get_param(param_file, mdl,
"NK", nk, &
130 "The number of model layers.", units=
"nondim", &
132 if (nk /= nk_)
call mom_error(fatal,
"verticalGridInit: " // &
133 "Mismatched number of layers NK_ between MOM_memory.h and param_file")
136 call get_param(param_file, mdl,
"NK", nk, &
137 "The number of model layers.", units=
"nondim", fail_if_missing=.true.)
141 if (gv%Boussinesq)
then 142 gv%H_to_kg_m2 = gv%Rho0 * gv%H_to_m
143 gv%kg_m2_to_H = 1.0 / gv%H_to_kg_m2
144 gv%m_to_H = 1.0 / gv%H_to_m
145 gv%Angstrom = gv%m_to_H * gv%Angstrom_z
147 gv%kg_m2_to_H = 1.0 / gv%H_to_kg_m2
148 gv%m_to_H = gv%Rho0 * gv%kg_m2_to_H
149 gv%H_to_m = gv%H_to_kg_m2 / gv%Rho0
150 gv%Angstrom = gv%Angstrom_z*1000.0*gv%kg_m2_to_H
152 gv%H_subroundoff = 1e-20 * max(gv%Angstrom,gv%m_to_H*1e-17)
153 gv%H_to_Pa = gv%g_Earth * gv%H_to_kg_m2
156 call log_param(param_file, mdl,
"M to THICKNESS", gv%m_to_H)
158 alloc_( gv%sInterface(nk+1) )
159 alloc_( gv%sLayer(nk) )
160 alloc_( gv%g_prime(nk+1) ) ; gv%g_prime(:) = 0.0
162 alloc_( gv%Rlay(nk+1) ) ; gv%Rlay(:) = 0.0
168 character(len=48) :: get_thickness_units
177 if (gv%Boussinesq)
then 178 get_thickness_units =
"meter" 180 get_thickness_units =
"kilogram meter-2" 186 character(len=48) :: get_flux_units
195 if (gv%Boussinesq)
then 196 get_flux_units =
"meter3 second-1" 198 get_flux_units =
"kilogram second-1" 204 character(len=48) :: get_tr_flux_units
208 character(len=*),
optional,
intent(in) :: tr_units
210 character(len=*),
optional,
intent(in) :: tr_vol_conc_units
214 character(len=*),
optional,
intent(in) :: tr_mass_conc_units
236 if (
present(tr_units)) cnt = cnt+1
237 if (
present(tr_vol_conc_units)) cnt = cnt+1
238 if (
present(tr_mass_conc_units)) cnt = cnt+1
240 if (cnt == 0)
call mom_error(fatal,
"get_tr_flux_units: One of the three "//&
241 "arguments tr_units, tr_vol_conc_units, or tr_mass_conc_units "//&
243 if (cnt > 1)
call mom_error(fatal,
"get_tr_flux_units: Only one of "//&
244 "tr_units, tr_vol_conc_units, and tr_mass_conc_units may be present.")
245 if (
present(tr_units))
then 246 if (gv%Boussinesq)
then 247 get_tr_flux_units = trim(tr_units)//
" meter3 second-1" 249 get_tr_flux_units = trim(tr_units)//
" kilogram second-1" 252 if (
present(tr_vol_conc_units))
then 253 if (gv%Boussinesq)
then 254 get_tr_flux_units = trim(tr_vol_conc_units)//
" second-1" 256 get_tr_flux_units = trim(tr_vol_conc_units)//
" m-3 kg s-1" 259 if (
present(tr_mass_conc_units))
then 260 if (gv%Boussinesq)
then 261 get_tr_flux_units = trim(tr_mass_conc_units)//
" kg-1 m3 s-1" 263 get_tr_flux_units = trim(tr_mass_conc_units)//
" second-1" 273 real,
dimension(GV%ke),
intent(in) :: Rlay
279 gv%zAxisLongName =
'Target Potential Density' 280 gv%zAxisUnits =
'kg m-3' 281 do k=1,nk ; gv%sLayer(k) = rlay(k) ;
enddo 283 gv%sInterface(1) = 1.5*rlay(1) - 0.5*rlay(2)
284 do k=2,nk ; gv%sInterface(k) = 0.5*( rlay(k-1) + rlay(k) ) ;
enddo 285 gv%sInterface(nk+1) = 1.5*rlay(nk) - 0.5*rlay(nk-1)
287 gv%sInterface(1) = 0.0 ; gv%sInterface(nk+1) = 2.0*rlay(nk)
297 dealloc_(gv%g_prime) ; dealloc_(gv%Rlay)
298 dealloc_( gv%sInterface )
299 dealloc_( gv%sLayer )
character(len=48) function, public get_flux_units(GV)
Returns the model's thickness flux units, usually m^3/s or kg/s.
character(len=48) function, public get_tr_flux_units(GV, tr_units, tr_vol_conc_units, tr_mass_conc_units)
Returns the model's tracer flux units.
subroutine, public setverticalgridaxes(Rlay, GV)
This sets the coordinate data for the "layer mode" of the isopycnal model.
subroutine, public verticalgridinit(param_file, GV)
Allocates and initializes the model's vertical grid structure.
subroutine, public verticalgridend(GV)
Deallocates the model's vertical grid structure.
character(len=48) function, public get_thickness_units(GV)
Returns the model's thickness units, usually m or kg/m^2.
subroutine, public mom_mesg(message, verb, all_print)
subroutine, public mom_error(level, message, all_print)