46 implicit none ;
private
48 public mom_initialize_fixed, mom_initialize_rotation, mom_initialize_topography
55 subroutine mom_initialize_fixed(G, US, OBC, PF, write_geom, output_dir)
61 logical,
intent(in) :: write_geom
62 character(len=*),
intent(in) :: output_dir
65 character(len=200) :: inputdir
66 character(len=200) :: config
67 character(len=40) :: mdl =
"MOM_fixed_initialization"
70 #include "version_variable.h"
72 call calltree_enter(
"MOM_initialize_fixed(), MOM_fixed_initialization.F90")
74 call get_param(pf, mdl,
"DEBUG", debug, default=.false.)
76 call get_param(pf, mdl,
"INPUTDIR", inputdir, &
77 "The directory in which input files are found.", default=
".")
78 inputdir = slasher(inputdir)
81 call set_grid_metrics(g, pf)
86 call mom_initialize_topography(g%bathyT, g%max_depth, g, pf, us)
93 call open_boundary_config(g, us, pf, obc)
96 call open_boundary_impose_normal_slope(obc, g, g%bathyT)
99 call initialize_masks(g, pf, us)
102 call open_boundary_impose_land_mask(obc, g, g%areaCu, g%areaCv)
105 call hchksum(g%bathyT,
'MOM_initialize_fixed: depth ', g%HI, haloshift=1, scale=us%Z_to_m)
106 call hchksum(g%mask2dT,
'MOM_initialize_fixed: mask2dT ', g%HI)
107 call uvchksum(
'MOM_initialize_fixed: mask2dC[uv]', g%mask2dCu, &
109 call qchksum(g%mask2dBu,
'MOM_initialize_fixed: mask2dBu ', g%HI)
113 call get_param(pf, mdl,
"CHANNEL_CONFIG", config, &
114 "A parameter that determines which set of channels are \n"//&
115 "restricted to specific widths. Options are:\n"//&
116 " \t none - All channels have the grid width.\n"//&
117 " \t global_1deg - Sets 16 specific channels appropriate \n"//&
118 " \t\t for a 1-degree model, as used in CM2G.\n"//&
119 " \t list - Read the channel locations and widths from a \n"//&
120 " \t\t text file, like MOM_channel_list in the MOM_SIS \n"//&
121 " \t\t test case.\n"//&
122 " \t file - Read open face widths everywhere from a \n"//&
123 " \t\t NetCDF file on the model grid.", &
125 select case ( trim(config) )
127 case (
"list") ;
call reset_face_lengths_list(g, pf)
128 case (
"file") ;
call reset_face_lengths_file(g, pf)
129 case (
"global_1deg") ;
call reset_face_lengths_named(g, pf, trim(config))
130 case default ;
call mom_error(fatal,
"MOM_initialize_fixed: "// &
131 "Unrecognized channel configuration "//trim(config))
135 if (g%bathymetry_at_vel)
then
136 call get_param(pf, mdl,
"VELOCITY_DEPTH_CONFIG", config, &
137 "A string that determines how the topography is set at "//&
138 "velocity points. This may be 'min' or 'max'.", &
140 select case ( trim(config) )
141 case (
"max") ;
call set_velocity_depth_max(g)
142 case (
"min") ;
call set_velocity_depth_min(g)
143 case default ;
call mom_error(fatal,
"MOM_initialize_fixed: "// &
144 "Unrecognized velocity depth configuration "//trim(config))
150 call mom_initialize_rotation(g%CoriolisBu, g, pf, us=us)
152 call mom_calculate_grad_coriolis(g%dF_dx, g%dF_dy, g, us=us)
154 call qchksum(g%CoriolisBu,
"MOM_initialize_fixed: f ", g%HI, scale=us%s_to_T)
155 call hchksum(g%dF_dx,
"MOM_initialize_fixed: dF_dx ", g%HI, scale=us%s_to_T)
156 call hchksum(g%dF_dy,
"MOM_initialize_fixed: dF_dy ", g%HI, scale=us%s_to_T)
159 call initialize_grid_rotation_angle(g, pf)
162 call compute_global_grid_integrals(g)
165 if (write_geom)
call write_ocean_geometry_file(g, pf, output_dir, us=us)
167 call calltree_leave(
'MOM_initialize_fixed()')
169 end subroutine mom_initialize_fixed
173 subroutine mom_initialize_topography(D, max_depth, G, PF, US)
175 real,
dimension(G%isd:G%ied,G%jsd:G%jed), &
178 real,
intent(out) :: max_depth
186 real :: m_to_z, z_to_m
187 character(len=40) :: mdl =
"MOM_initialize_topography"
188 character(len=200) :: config
190 m_to_z = 1.0 ;
if (
present(us)) m_to_z = us%m_to_Z
191 z_to_m = 1.0 ;
if (
present(us)) z_to_m = us%Z_to_m
193 call get_param(pf, mdl,
"TOPO_CONFIG", config, &
194 "This specifies how bathymetry is specified: \n"//&
195 " \t file - read bathymetric information from the file \n"//&
196 " \t\t specified by (TOPO_FILE).\n"//&
197 " \t flat - flat bottom set to MAXIMUM_DEPTH. \n"//&
198 " \t bowl - an analytically specified bowl-shaped basin \n"//&
199 " \t\t ranging between MAXIMUM_DEPTH and MINIMUM_DEPTH. \n"//&
200 " \t spoon - a similar shape to 'bowl', but with an vertical \n"//&
201 " \t\t wall at the southern face. \n"//&
202 " \t halfpipe - a zonally uniform channel with a half-sine \n"//&
203 " \t\t profile in the meridional direction. \n"//&
204 " \t benchmark - use the benchmark test case topography. \n"//&
205 " \t Neverland - use the Neverland test case topography. \n"//&
206 " \t DOME - use a slope and channel configuration for the \n"//&
207 " \t\t DOME sill-overflow test case. \n"//&
208 " \t ISOMIP - use a slope and channel configuration for the \n"//&
209 " \t\t ISOMIP test case. \n"//&
210 " \t DOME2D - use a shelf and slope configuration for the \n"//&
211 " \t\t DOME2D gravity current/overflow test case. \n"//&
212 " \t Kelvin - flat but with rotated land mask.\n"//&
213 " \t seamount - Gaussian bump for spontaneous motion test case.\n"//&
214 " \t dumbbell - Sloshing channel with reservoirs on both ends.\n"//&
215 " \t shelfwave - exponential slope for shelfwave test case.\n"//&
216 " \t Phillips - ACC-like idealized topography used in the Phillips config.\n"//&
217 " \t dense - Denmark Strait-like dense water formation and overflow.\n"//&
218 " \t USER - call a user modified routine.", &
219 fail_if_missing=.true.)
220 max_depth = -1.e9*m_to_z ;
call read_param(pf,
"MAXIMUM_DEPTH", max_depth, scale=m_to_z)
221 select case ( trim(config) )
222 case (
"file");
call initialize_topography_from_file(d, g, pf, us)
223 case (
"flat");
call initialize_topography_named(d, g, pf, config, max_depth, us)
224 case (
"spoon");
call initialize_topography_named(d, g, pf, config, max_depth, us)
225 case (
"bowl");
call initialize_topography_named(d, g, pf, config, max_depth, us)
226 case (
"halfpipe");
call initialize_topography_named(d, g, pf, config, max_depth, us)
227 case (
"DOME");
call dome_initialize_topography(d, g, pf, max_depth, us)
228 case (
"ISOMIP");
call isomip_initialize_topography(d, g, pf, max_depth, us)
229 case (
"benchmark");
call benchmark_initialize_topography(d, g, pf, max_depth, us)
230 case (
"Neverland");
call neverland_initialize_topography(d, g, pf, max_depth)
231 case (
"DOME2D");
call dome2d_initialize_topography(d, g, pf, max_depth)
232 case (
"Kelvin");
call kelvin_initialize_topography(d, g, pf, max_depth, us)
233 case (
"sloshing");
call sloshing_initialize_topography(d, g, pf, max_depth)
234 case (
"seamount");
call seamount_initialize_topography(d, g, pf, max_depth)
235 case (
"dumbbell");
call dumbbell_initialize_topography(d, g, pf, max_depth)
236 case (
"shelfwave");
call shelfwave_initialize_topography(d, g, pf, max_depth, us)
237 case (
"Phillips");
call phillips_initialize_topography(d, g, pf, max_depth, us)
238 case (
"dense");
call dense_water_initialize_topography(d, g, pf, max_depth)
239 case (
"USER");
call user_initialize_topography(d, g, pf, max_depth, us)
240 case default ;
call mom_error(fatal,
"MOM_initialize_topography: "// &
241 "Unrecognized topography setup '"//trim(config)//
"'")
243 if (max_depth>0.)
then
244 call log_param(pf, mdl,
"MAXIMUM_DEPTH", max_depth*z_to_m, &
245 "The maximum depth of the ocean.", units=
"m")
247 max_depth = diagnosemaximumdepth(d,g)
248 call log_param(pf, mdl,
"!MAXIMUM_DEPTH", max_depth*z_to_m, &
249 "The (diagnosed) maximum depth of the ocean.", units=
"m")
251 if (trim(config) /=
"DOME")
then
252 call limit_topography(d, g, pf, max_depth, us)
255 end subroutine mom_initialize_topography