129 type(hor_index_type),
intent(in) :: hi
130 type(verticalgrid_type),
intent(in) :: gv
131 type(param_file_type),
intent(in) :: param_file
132 type(dye_tracer_cs),
pointer :: cs
133 type(tracer_registry_type),
pointer :: tr_reg
134 type(mom_restart_cs),
pointer :: restart_cs
148 #include "version_variable.h" 149 character(len=40) :: mdl =
"regional_dyes" 150 character(len=200) :: inputdir
151 character(len=48) :: var_name
152 character(len=48) :: desc_name
153 real,
pointer :: tr_ptr(:,:,:) => null()
154 logical :: register_dye_tracer
155 integer :: isd, ied, jsd, jed, nz, m
156 isd = hi%isd ; ied = hi%ied ; jsd = hi%jsd ; jed = hi%jed ; nz = gv%ke
158 if (
associated(cs))
then 159 call mom_error(warning,
"register_dye_tracer called with an "// &
160 "associated control structure.")
166 call log_version(param_file, mdl, version,
"")
167 call get_param(param_file, mdl,
"NUM_DYE_TRACERS", cs%ntr, &
168 "The number of dye tracers in this run. Each tracer \n"//&
169 "should have a separate region.", default=0)
170 allocate(cs%dye_source_minlon(cs%ntr), &
171 cs%dye_source_maxlon(cs%ntr), &
172 cs%dye_source_minlat(cs%ntr), &
173 cs%dye_source_maxlat(cs%ntr), &
174 cs%dye_source_mindepth(cs%ntr), &
175 cs%dye_source_maxdepth(cs%ntr))
176 allocate(cs%tr_adx(cs%ntr), &
180 allocate(cs%ind_tr(cs%ntr), &
181 cs%id_tracer(cs%ntr), &
182 cs%id_tr_adx(cs%ntr), &
183 cs%id_tr_ady(cs%ntr), &
184 cs%id_tr_dfx(cs%ntr), &
185 cs%id_tr_dfy(cs%ntr))
186 allocate(cs%tr_desc(cs%ntr))
194 cs%dye_source_minlon(:) = -1.e30
195 call get_param(param_file, mdl,
"DYE_SOURCE_MINLON", cs%dye_source_minlon, &
196 "This is the starting longitude at which we start injecting dyes.", &
197 fail_if_missing=.true.)
198 if (minval(cs%dye_source_minlon(:)) < -1.e29) &
199 call mom_error(fatal,
"register_dye_tracer: Not enough values provided for DYE_SOURCE_MINLON ")
201 cs%dye_source_maxlon(:) = -1.e30
202 call get_param(param_file, mdl,
"DYE_SOURCE_MAXLON", cs%dye_source_maxlon, &
203 "This is the ending longitude at which we finish injecting dyes.", &
204 fail_if_missing=.true.)
205 if (minval(cs%dye_source_maxlon(:)) < -1.e29) &
206 call mom_error(fatal,
"register_dye_tracer: Not enough values provided for DYE_SOURCE_MAXLON ")
208 cs%dye_source_minlat(:) = -1.e30
209 call get_param(param_file, mdl,
"DYE_SOURCE_MINLAT", cs%dye_source_minlat, &
210 "This is the starting latitude at which we start injecting dyes.", &
211 fail_if_missing=.true.)
212 if (minval(cs%dye_source_minlat(:)) < -1.e29) &
213 call mom_error(fatal,
"register_dye_tracer: Not enough values provided for DYE_SOURCE_MINLAT ")
215 cs%dye_source_maxlat(:) = -1.e30
216 call get_param(param_file, mdl,
"DYE_SOURCE_MAXLAT", cs%dye_source_maxlat, &
217 "This is the ending latitude at which we finish injecting dyes.", &
218 fail_if_missing=.true.)
219 if (minval(cs%dye_source_maxlat(:)) < -1.e29) &
220 call mom_error(fatal,
"register_dye_tracer: Not enough values provided for DYE_SOURCE_MAXLAT ")
222 cs%dye_source_mindepth(:) = -1.e30
223 call get_param(param_file, mdl,
"DYE_SOURCE_MINDEPTH", cs%dye_source_mindepth, &
224 "This is the minumum depth at which we inject dyes.", &
225 fail_if_missing=.true.)
226 if (minval(cs%dye_source_mindepth(:)) < -1.e29) &
227 call mom_error(fatal,
"register_dye_tracer: Not enough values provided for DYE_SOURCE_MINDEPTH")
229 cs%dye_source_maxdepth(:) = -1.e30
230 call get_param(param_file, mdl,
"DYE_SOURCE_MAXDEPTH", cs%dye_source_maxdepth, &
231 "This is the maximum depth at which we inject dyes.", &
232 fail_if_missing=.true.)
233 if (minval(cs%dye_source_maxdepth(:)) < -1.e29) &
234 call mom_error(fatal,
"register_dye_tracer: Not enough values provided for DYE_SOURCE_MAXDEPTH ")
237 write(var_name(:),
'(A,I3.3)')
"dye",m
238 write(desc_name(:),
'(A,I3.3)')
"Dye Tracer ",m
239 cs%tr_desc(m) = var_desc(trim(var_name),
"conc", trim(desc_name), caller=mdl)
244 allocate(cs%tr(isd:ied,jsd:jed,nz,cs%ntr)) ; cs%tr(:,:,:,:) = 0.0
249 tr_ptr => cs%tr(:,:,:,m)
250 call query_vardesc(cs%tr_desc(m), name=var_name, &
251 caller=
"register_dye_tracer")
253 call register_restart_field(tr_ptr, cs%tr_desc(m), &
254 .not.cs%tracers_may_reinit, restart_cs)
256 call register_tracer(tr_ptr, cs%tr_desc(m), param_file, hi, gv, tr_reg, &
257 tr_desc_ptr=cs%tr_desc(m))
262 if (cs%coupled_tracers) &
263 cs%ind_tr(m) = aof_set_coupler_flux(trim(var_name)//
'_flux', &
264 flux_type=
' ', implementation=
' ', caller=
"register_dye_tracer")
268 cs%restart_CSp => restart_cs
269 register_dye_tracer = .true.