208 logical,
intent(in) :: restart
209 type(time_type),
target,
intent(in) :: day
211 type(verticalgrid_type),
intent(in) :: gv
212 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)), &
214 type(diag_ctrl),
target,
intent(in) :: diag
215 type(ocean_obc_type),
pointer :: obc
216 type(user_tracer_example_cs),
pointer :: cs
217 type(sponge_cs),
pointer :: sponge_csp
218 type(diag_to_z_cs),
pointer :: diag_to_z_csp
237 real,
allocatable :: temp(:,:,:)
238 real,
pointer,
dimension(:,:,:) :: &
239 obc_tr1_u => null(), &
243 character(len=32) :: name
244 character(len=72) :: longname
245 character(len=48) :: units
246 character(len=48) :: flux_units
248 real,
pointer :: tr_ptr(:,:,:) => null()
252 integer :: i, j, k, is, ie, js, je, isd, ied, jsd, jed, nz, m
253 integer :: isdb, iedb, jsdb, jedb, lntr
255 if (.not.
associated(cs))
return 256 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
257 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
258 isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
264 if (.not.restart)
then 265 if (len_trim(cs%tracer_IC_file) >= 1)
then 267 if (.not.file_exists(cs%tracer_IC_file, g%Domain)) &
268 call mom_error(fatal,
"USER_initialize_tracer: Unable to open "// &
271 call query_vardesc(cs%tr_desc(m), name, caller=
"USER_initialize_tracer")
272 call read_data(cs%tracer_IC_file, trim(name), &
273 cs%tr(:,:,:,m), domain=g%Domain%mpp_domain)
277 do k=1,nz ;
do j=js,je ;
do i=is,ie
278 cs%tr(i,j,k,m) = 1.0e-20
279 enddo ;
enddo ;
enddo 285 dist2 = (g%Rad_Earth * pi / 180.0)**2 * &
286 (g%geoLatT(i,j) - 40.0) * (g%geoLatT(i,j) - 40.0)
287 tr_y = 0.5*exp(-dist2/(1.0e5*1.0e5))
289 do k=1,nz ;
do i=is,ie
291 cs%tr(i,j,k,1) = cs%tr(i,j,k,1) + tr_y
297 if ( cs%use_sponge )
then 302 if (.not.
associated(sponge_csp)) &
303 call mom_error(fatal,
"USER_initialize_tracer: "// &
304 "The pointer to sponge_CSp must be associated if SPONGE is defined.")
306 allocate(temp(g%isd:g%ied,g%jsd:g%jed,nz))
307 do k=1,nz ;
do j=js,je ;
do i=is,ie
308 if (g%geoLatT(i,j) > 700.0 .and. (k > nz/2))
then 313 enddo ;
enddo ;
enddo 319 tr_ptr => cs%tr(:,:,:,m)
320 call set_up_sponge_field(temp, tr_ptr, g, nz, sponge_csp)
325 if (
associated(obc))
then 326 call query_vardesc(cs%tr_desc(1), name, caller=
"USER_initialize_tracer")
327 if (obc%specified_v_BCs_exist_globally)
then 328 allocate(obc_tr1_v(g%isd:g%ied,g%jsd:g%jed,nz))
329 do k=1,nz ;
do j=g%jsd,g%jed ;
do i=g%isd,g%ied
330 if (k < nz/2)
then ; obc_tr1_v(i,j,k) = 0.0
331 else ; obc_tr1_v(i,j,k) = 1.0 ;
endif 332 enddo ;
enddo ;
enddo 333 call add_tracer_obc_values(trim(name), cs%tr_Reg, &
334 0.0, obc_in_v=obc_tr1_v)
337 call add_tracer_obc_values(trim(name), cs%tr_Reg, 0.0)
342 call query_vardesc(cs%tr_desc(m), name, caller=
"USER_initialize_tracer")
343 call add_tracer_obc_values(trim(name), cs%tr_Reg, 0.0)
348 if (gv%Boussinesq)
then ; flux_units =
"kg kg-1 m3 s-1" 349 else ; flux_units =
"kg s-1" ;
endif 353 call query_vardesc(cs%tr_desc(m), name, units=units, longname=longname, &
354 caller=
"USER_initialize_tracer")
355 cs%id_tracer(m) = register_diag_field(
"ocean_model", trim(name), cs%diag%axesTL, &
356 day, trim(longname) , trim(units))
357 cs%id_tr_adx(m) = register_diag_field(
"ocean_model", trim(name)//
"_adx", &
358 cs%diag%axesCuL, day, trim(longname)//
" advective zonal flux" , &
360 cs%id_tr_ady(m) = register_diag_field(
"ocean_model", trim(name)//
"_ady", &
361 cs%diag%axesCvL, day, trim(longname)//
" advective meridional flux" , &
363 cs%id_tr_dfx(m) = register_diag_field(
"ocean_model", trim(name)//
"_dfx", &
364 cs%diag%axesCuL, day, trim(longname)//
" diffusive zonal flux" , &
366 cs%id_tr_dfy(m) = register_diag_field(
"ocean_model", trim(name)//
"_dfy", &
367 cs%diag%axesCvL, day, trim(longname)//
" diffusive zonal flux" , &
369 if (cs%id_tr_adx(m) > 0)
call safe_alloc_ptr(cs%tr_adx(m)%p,isdb,iedb,jsd,jed,nz)
370 if (cs%id_tr_ady(m) > 0)
call safe_alloc_ptr(cs%tr_ady(m)%p,isd,ied,jsdb,jedb,nz)
371 if (cs%id_tr_dfx(m) > 0)
call safe_alloc_ptr(cs%tr_dfx(m)%p,isdb,iedb,jsd,jed,nz)
372 if (cs%id_tr_dfy(m) > 0)
call safe_alloc_ptr(cs%tr_dfy(m)%p,isd,ied,jsdb,jedb,nz)
375 if ((cs%id_tr_adx(m) > 0) .or. (cs%id_tr_ady(m) > 0) .or. &
376 (cs%id_tr_dfx(m) > 0) .or. (cs%id_tr_dfy(m) > 0)) &
377 call add_tracer_diagnostics(name, cs%tr_Reg, cs%tr_adx(m)%p, &
378 cs%tr_ady(m)%p,cs%tr_dfx(m)%p,cs%tr_dfy(m)%p)
380 call register_z_tracer(cs%tr(:,:,:,m), trim(name), longname, units, &
381 day, g, diag_to_z_csp)
Ocean grid type. See mom_grid for details.