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