8 use mom_domains, only : get_global_shape, get_domain_extent_dsamp2
13 implicit none ;
private 15 #include <MOM_memory.h> 17 public mom_grid_init, mom_grid_end, set_derived_metrics, set_first_direction
18 public ispointincell,
hor_index_type, get_global_grid_size, rescale_grid_bathymetry
68 logical :: nonblocking_updates
70 integer :: first_direction
76 real allocable_,
dimension(NIMEM_,NJMEM_) :: &
77 mask2dt, & !< 0 for land points and 1 for ocean points on the h-grid [nondim].
78 geolatt, & !< The geographic latitude at q points in degrees of latitude or m.
79 geolont, & !< The geographic longitude at q points in degrees of longitude or m.
80 dxt, & !< dxT is delta x at h points [L ~> m].
81 idxt, & !< 1/dxT [L-1 ~> m-1].
82 dyt, & !< dyT is delta y at h points [L ~> m].
83 idyt, & !< IdyT is 1/dyT [L-1 ~> m-1].
84 areat, & !< The area of an h-cell [L2 ~> m2].
85 iareat, & !< 1/areaT [L-2 ~> m-2].
86 sin_rot, & !< The sine of the angular rotation between the local model grid
's northward 87 !! and the true northward directions. 88 cos_rot !< The cosine of the angular rotation between the local model grid's northward
91 real allocable_,
dimension(NIMEMB_PTR_,NJMEM_) :: &
92 mask2dcu, & !< 0 for boundary points and 1 for ocean points on the u grid [nondim].
93 geolatcu, & !< The geographic latitude at u points in degrees of latitude or m.
94 geoloncu, & !< The geographic longitude at u points in degrees of longitude or m.
95 dxcu, & !< dxCu is delta x at u points [L ~> m].
96 idxcu, & !< 1/dxCu [L-1 ~> m-1].
97 dycu, & !< dyCu is delta y at u points [L ~> m].
98 idycu, & !< 1/dyCu [L-1 ~> m-1].
99 dy_cu, & !< The unblocked lengths of the u-faces of the h-cell [L ~> m].
100 iareacu, & !< The masked inverse areas of u-grid cells [L-2 ~> m-2].
103 real allocable_,
dimension(NIMEM_,NJMEMB_PTR_) :: &
104 mask2dcv, & !< 0 for boundary points and 1 for ocean points on the v grid [nondim].
105 geolatcv, & !< The geographic latitude at v points in degrees of latitude or m.
106 geoloncv, & !< The geographic longitude at v points in degrees of longitude or m.
107 dxcv, & !< dxCv is delta x at v points [L ~> m].
108 idxcv, & !< 1/dxCv [L-1 ~> m-1].
109 dycv, & !< dyCv is delta y at v points [L ~> m].
110 idycv, & !< 1/dyCv [L-1 ~> m-1].
111 dx_cv, & !< The unblocked lengths of the v-faces of the h-cell [L ~> m].
112 iareacv, & !< The masked inverse areas of v-grid cells [L-2 ~> m-2].
115 real allocable_,
dimension(NIMEMB_PTR_,NJMEMB_PTR_) :: &
116 mask2dbu, & !< 0 for boundary points and 1 for ocean points on the q grid [nondim].
117 geolatbu, & !< The geographic latitude at q points in degrees of latitude or m.
118 geolonbu, & !< The geographic longitude at q points in degrees of longitude or m.
119 dxbu, & !< dxBu is delta x at q points [L ~> m].
120 idxbu, & !< 1/dxBu [L-1 ~> m-1].
121 dybu, & !< dyBu is delta y at q points [L ~> m].
122 idybu, & !< 1/dyBu [L-1 ~> m-1].
123 areabu, & !< areaBu is the area of a q-cell [L2 ~> m2]
126 real,
pointer,
dimension(:) :: &
127 gridlatt => null(), &
131 real,
pointer,
dimension(:) :: &
132 gridlont => null(), &
136 character(len=40) :: &
137 x_axis_units, & !< The units that are used in labeling the x coordinate axes.
140 real allocable_,
dimension(NIMEM_,NJMEM_) :: &
144 logical :: bathymetry_at_vel
147 real allocable_,
dimension(NIMEMB_PTR_,NJMEM_) :: &
148 dblock_u, & !< Topographic depths at u-points at which the flow is blocked [Z ~> m].
150 real allocable_,
dimension(NIMEM_,NJMEMB_PTR_) :: &
151 dblock_v, & !< Topographic depths at v-points at which the flow is blocked [Z ~> m].
153 real allocable_,
dimension(NIMEMB_PTR_,NJMEMB_PTR_) :: &
155 real allocable_,
dimension(NIMEM_,NJMEM_) :: &
156 df_dx, & !< Derivative d/dx f (Coriolis parameter) at h-points [T-1 L-1 ~> s-1 m-1].
161 real :: iareat_global
176 real :: rad_earth = 6.378e6
183 subroutine mom_grid_init(G, param_file, US, HI, global_indexing, bathymetry_at_vel)
188 optional,
intent(in) :: HI
189 logical,
optional,
intent(in) :: global_indexing
192 logical,
optional,
intent(in) :: bathymetry_at_vel
198 real :: mean_SeaLev_scale
199 integer :: isd, ied, jsd, jed, nk
200 integer :: IsdB, IedB, JsdB, JedB
201 integer :: ied_max, jed_max
202 integer :: niblock, njblock, nihalo, njhalo, nblocks, n, i, j
203 logical :: local_indexing
206 # include "version_variable.h" 208 integer,
allocatable,
dimension(:) :: ibegin, iend, jbegin, jend
209 character(len=40) :: mod_nm =
"MOM_grid" 213 call get_param(param_file, mod_nm,
"REFERENCE_HEIGHT", g%Z_ref, default=0.0, do_not_log=.true.)
215 "Parameters providing information about the lateral grid.", &
216 log_to_all=.true., layout=.true., all_default=(g%Z_ref==0.0))
218 call get_param(param_file, mod_nm,
"NIBLOCK", niblock,
"The number of blocks "// &
219 "in the x-direction on each processor (for openmp).", default=1, &
221 call get_param(param_file, mod_nm,
"NJBLOCK", njblock,
"The number of blocks "// &
222 "in the y-direction on each processor (for openmp).", default=1, &
224 if (
present(us))
then ;
if (
associated(us)) g%US => us ;
endif 226 mean_sealev_scale = 1.0 ;
if (
associated(g%US)) mean_sealev_scale = g%US%m_to_Z
227 call get_param(param_file, mod_nm,
"REFERENCE_HEIGHT", g%Z_ref, &
228 "A reference value for geometric height fields, such as bathyT.", &
229 units=
"m", default=0.0, scale=mean_sealev_scale)
231 if (
present(hi))
then 234 g%isc = hi%isc ; g%iec = hi%iec ; g%jsc = hi%jsc ; g%jec = hi%jec
235 g%isd = hi%isd ; g%ied = hi%ied ; g%jsd = hi%jsd ; g%jed = hi%jed
236 g%isg = hi%isg ; g%ieg = hi%ieg ; g%jsg = hi%jsg ; g%jeg = hi%jeg
238 g%IscB = hi%IscB ; g%IecB = hi%IecB ; g%JscB = hi%JscB ; g%JecB = hi%JecB
239 g%IsdB = hi%IsdB ; g%IedB = hi%IedB ; g%JsdB = hi%JsdB ; g%JedB = hi%JedB
240 g%IsgB = hi%IsgB ; g%IegB = hi%IegB ; g%JsgB = hi%JsgB ; g%JegB = hi%JegB
242 g%idg_offset = hi%idg_offset ; g%jdg_offset = hi%jdg_offset
243 g%isd_global = g%isd + hi%idg_offset ; g%jsd_global = g%jsd + hi%jdg_offset
244 g%symmetric = hi%symmetric
246 local_indexing = .true.
247 if (
present(global_indexing)) local_indexing = .not.global_indexing
248 call hor_index_init(g%Domain, g%HI, param_file, &
249 local_indexing=local_indexing)
253 call get_domain_extent(g%Domain, g%isc, g%iec, g%jsc, g%jec, &
254 g%isd, g%ied, g%jsd, g%jed, &
255 g%isg, g%ieg, g%jsg, g%jeg, &
256 g%idg_offset, g%jdg_offset, g%symmetric, &
257 local_indexing=local_indexing)
258 g%isd_global = g%isd+g%idg_offset ; g%jsd_global = g%jsd+g%jdg_offset
261 g%nonblocking_updates = g%Domain%nonblocking_updates
264 g%IscB = g%isc ; g%JscB = g%jsc
265 g%IsdB = g%isd ; g%JsdB = g%jsd
266 g%IsgB = g%isg ; g%JsgB = g%jsg
267 if (g%symmetric)
then 268 g%IscB = g%isc-1 ; g%JscB = g%jsc-1
269 g%IsdB = g%isd-1 ; g%JsdB = g%jsd-1
270 g%IsgB = g%isg-1 ; g%JsgB = g%jsg-1
272 g%IecB = g%iec ; g%JecB = g%jec
273 g%IedB = g%ied ; g%JedB = g%jed
274 g%IegB = g%ieg ; g%JegB = g%jeg
276 call mom_mesg(
" MOM_grid.F90, MOM_grid_init: allocating metrics", 5)
278 call allocate_metrics(g)
280 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
281 isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
283 g%bathymetry_at_vel = .false.
284 if (
present(bathymetry_at_vel)) g%bathymetry_at_vel = bathymetry_at_vel
285 if (g%bathymetry_at_vel)
then 286 alloc_(g%Dblock_u(isdb:iedb, jsd:jed)) ; g%Dblock_u(:,:) = 0.0
287 alloc_(g%Dopen_u(isdb:iedb, jsd:jed)) ; g%Dopen_u(:,:) = 0.0
288 alloc_(g%Dblock_v(isd:ied, jsdb:jedb)) ; g%Dblock_v(:,:) = 0.0
289 alloc_(g%Dopen_v(isd:ied, jsdb:jedb)) ; g%Dopen_v(:,:) = 0.0
293 nihalo = g%Domain%nihalo
294 njhalo = g%Domain%njhalo
295 nblocks = niblock * njblock
296 if (nblocks < 1)
call mom_error(fatal,
"MOM_grid_init: " // &
297 "nblocks(=NI_BLOCK*NJ_BLOCK) must be no less than 1")
299 allocate(ibegin(niblock), iend(niblock), jbegin(njblock), jend(njblock))
300 call compute_block_extent(g%HI%isc,g%HI%iec,niblock,ibegin,iend)
301 call compute_block_extent(g%HI%jsc,g%HI%jec,njblock,jbegin,jend)
304 if (iend(i)-ibegin(i) > iend(niblock)-ibegin(niblock) )
call mom_error(fatal, &
305 "MOM_grid_init: the last block size in x-direction is not the largest")
308 if (jend(j)-jbegin(j) > jend(njblock)-jbegin(njblock) )
call mom_error(fatal, &
309 "MOM_grid_init: the last block size in y-direction is not the largest")
313 allocate(g%Block(nblocks))
314 ied_max = 1 ; jed_max = 1
319 i = mod((n-1), niblock) + 1
320 j = (n-1)/niblock + 1
322 g%Block(n)%isd = 1 ; g%Block(n)%jsd = 1
323 g%Block(n)%isc = g%Block(n)%isd+nihalo
324 g%Block(n)%jsc = g%Block(n)%jsd+njhalo
325 g%Block(n)%iec = g%Block(n)%isc + iend(i) - ibegin(i)
326 g%Block(n)%jec = g%Block(n)%jsc + jend(j) - jbegin(j)
327 g%Block(n)%ied = g%Block(n)%iec + nihalo
328 g%Block(n)%jed = g%Block(n)%jec + njhalo
329 g%Block(n)%IscB = g%Block(n)%isc; g%Block(n)%IecB = g%Block(n)%iec
330 g%Block(n)%JscB = g%Block(n)%jsc; g%Block(n)%JecB = g%Block(n)%jec
333 if (g%symmetric)
then 334 if (i==1) g%Block(n)%IscB = g%Block(n)%IscB-1
335 if (j==1) g%Block(n)%JscB = g%Block(n)%JscB-1
337 g%Block(n)%IsdB = g%Block(n)%isd; g%Block(n)%IedB = g%Block(n)%ied
338 g%Block(n)%JsdB = g%Block(n)%jsd; g%Block(n)%JedB = g%Block(n)%jed
341 if (g%symmetric)
then 342 g%Block(n)%IsdB = g%Block(n)%IsdB-1
343 g%Block(n)%JsdB = g%Block(n)%JsdB-1
345 g%Block(n)%idg_offset = (ibegin(i) - g%Block(n)%isc) + g%HI%idg_offset
346 g%Block(n)%jdg_offset = (jbegin(j) - g%Block(n)%jsc) + g%HI%jdg_offset
349 ied_max = max(ied_max, g%Block(n)%ied)
350 jed_max = max(jed_max, g%Block(n)%jed)
356 g%Block(n)%ied = ied_max ; g%Block(n)%IedB = ied_max
357 g%Block(n)%jed = jed_max ; g%Block(n)%JedB = jed_max
361 if ( g%block(nblocks)%ied+g%block(nblocks)%idg_offset > g%HI%ied + g%HI%idg_offset ) &
362 call mom_error(fatal,
"MOM_grid_init: G%ied_bk > G%ied")
363 if ( g%block(nblocks)%jed+g%block(nblocks)%jdg_offset > g%HI%jed + g%HI%jdg_offset ) &
364 call mom_error(fatal,
"MOM_grid_init: G%jed_bk > G%jed")
366 call get_domain_extent_dsamp2(g%Domain, g%HId2%isc, g%HId2%iec, g%HId2%jsc, g%HId2%jec,&
367 g%HId2%isd, g%HId2%ied, g%HId2%jsd, g%HId2%jed,&
368 g%HId2%isg, g%HId2%ieg, g%HId2%jsg, g%HId2%jeg)
371 g%HId2%IscB = g%HId2%isc ; g%HId2%JscB = g%HId2%jsc
372 g%HId2%IsdB = g%HId2%isd ; g%HId2%JsdB = g%HId2%jsd
373 g%HId2%IsgB = g%HId2%isg ; g%HId2%JsgB = g%HId2%jsg
374 if (g%symmetric)
then 375 g%HId2%IscB = g%HId2%isc-1 ; g%HId2%JscB = g%HId2%jsc-1
376 g%HId2%IsdB = g%HId2%isd-1 ; g%HId2%JsdB = g%HId2%jsd-1
377 g%HId2%IsgB = g%HId2%isg-1 ; g%HId2%JsgB = g%HId2%jsg-1
379 g%HId2%IecB = g%HId2%iec ; g%HId2%JecB = g%HId2%jec
380 g%HId2%IedB = g%HId2%ied ; g%HId2%JedB = g%HId2%jed
381 g%HId2%IegB = g%HId2%ieg ; g%HId2%JegB = g%HId2%jeg
383 end subroutine mom_grid_init
387 subroutine rescale_grid_bathymetry(G, m_in_new_units)
389 real,
intent(in) :: m_in_new_units
393 integer :: i, j, isd, ied, jsd, jed, IsdB, IedB, JsdB, JedB
395 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
396 isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
398 if (m_in_new_units == 1.0)
return 399 if (m_in_new_units < 0.0) &
400 call mom_error(fatal,
"rescale_grid_bathymetry: Negative depth units are not permitted.")
401 if (m_in_new_units == 0.0) &
402 call mom_error(fatal,
"rescale_grid_bathymetry: Zero depth units are not permitted.")
404 rescale = 1.0 / m_in_new_units
405 do j=jsd,jed ;
do i=isd,ied
406 g%bathyT(i,j) = rescale*g%bathyT(i,j)
408 if (g%bathymetry_at_vel)
then ;
do j=jsd,jed ;
do i=isdb,iedb
409 g%Dblock_u(i,j) = rescale*g%Dblock_u(i,j) ; g%Dopen_u(i,j) = rescale*g%Dopen_u(i,j)
410 enddo ;
enddo ;
endif 411 if (g%bathymetry_at_vel)
then ;
do j=jsdb,jedb ;
do i=isd,ied
412 g%Dblock_v(i,j) = rescale*g%Dblock_v(i,j) ; g%Dopen_v(i,j) = rescale*g%Dopen_v(i,j)
413 enddo ;
enddo ;
endif 414 g%max_depth = rescale*g%max_depth
416 end subroutine rescale_grid_bathymetry
419 subroutine set_derived_metrics(G, US)
424 integer :: i, j, isd, ied, jsd, jed
425 integer :: IsdB, IedB, JsdB, JedB
427 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
428 isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
430 do j=jsd,jed ;
do i=isd,ied
431 if (g%dxT(i,j) < 0.0) g%dxT(i,j) = 0.0
432 if (g%dyT(i,j) < 0.0) g%dyT(i,j) = 0.0
433 g%IdxT(i,j) = adcroft_reciprocal(g%dxT(i,j))
434 g%IdyT(i,j) = adcroft_reciprocal(g%dyT(i,j))
435 g%IareaT(i,j) = adcroft_reciprocal(g%areaT(i,j))
438 do j=jsd,jed ;
do i=isdb,iedb
439 if (g%dxCu(i,j) < 0.0) g%dxCu(i,j) = 0.0
440 if (g%dyCu(i,j) < 0.0) g%dyCu(i,j) = 0.0
441 g%IdxCu(i,j) = adcroft_reciprocal(g%dxCu(i,j))
442 g%IdyCu(i,j) = adcroft_reciprocal(g%dyCu(i,j))
445 do j=jsdb,jedb ;
do i=isd,ied
446 if (g%dxCv(i,j) < 0.0) g%dxCv(i,j) = 0.0
447 if (g%dyCv(i,j) < 0.0) g%dyCv(i,j) = 0.0
448 g%IdxCv(i,j) = adcroft_reciprocal(g%dxCv(i,j))
449 g%IdyCv(i,j) = adcroft_reciprocal(g%dyCv(i,j))
452 do j=jsdb,jedb ;
do i=isdb,iedb
453 if (g%dxBu(i,j) < 0.0) g%dxBu(i,j) = 0.0
454 if (g%dyBu(i,j) < 0.0) g%dyBu(i,j) = 0.0
456 g%IdxBu(i,j) = adcroft_reciprocal(g%dxBu(i,j))
457 g%IdyBu(i,j) = adcroft_reciprocal(g%dyBu(i,j))
459 if (g%areaBu(i,j) <= 0.0) g%areaBu(i,j) = g%dxBu(i,j) * g%dyBu(i,j)
460 g%IareaBu(i,j) = adcroft_reciprocal(g%areaBu(i,j))
462 end subroutine set_derived_metrics
465 function adcroft_reciprocal(val)
result(I_val)
466 real,
intent(in) :: val
469 i_val = 0.0 ;
if (val /= 0.0) i_val = 1.0/val
470 end function adcroft_reciprocal
473 logical function ispointincell(G, i, j, x, y)
475 integer,
intent(in) :: i
476 integer,
intent(in) :: j
477 real,
intent(in) :: x
478 real,
intent(in) :: y
480 real :: xNE, xNW, xSE, xSW, yNE, yNW, ySE, ySW
481 real :: p0, p1, p2, p3, l0, l1, l2, l3
482 ispointincell = .false.
483 xne = g%geoLonBu(i ,j ) ; yne = g%geoLatBu(i ,j )
484 xnw = g%geoLonBu(i-1,j ) ; ynw = g%geoLatBu(i-1,j )
485 xse = g%geoLonBu(i ,j-1) ; yse = g%geoLatBu(i ,j-1)
486 xsw = g%geoLonBu(i-1,j-1) ; ysw = g%geoLatBu(i-1,j-1)
488 if (x<min(xne,xnw,xse,xsw) .or. x>max(xne,xnw,xse,xsw) .or. &
489 y<min(yne,ynw,yse,ysw) .or. y>max(yne,ynw,yse,ysw) )
then 492 l0 = (x-xsw)*(yse-ysw) - (y-ysw)*(xse-xsw)
493 l1 = (x-xse)*(yne-yse) - (y-yse)*(xne-xse)
494 l2 = (x-xne)*(ynw-yne) - (y-yne)*(xnw-xne)
495 l3 = (x-xnw)*(ysw-ynw) - (y-ynw)*(xsw-xnw)
497 p0 = sign(1., l0) ;
if (l0 == 0.) p0=0.
498 p1 = sign(1., l1) ;
if (l1 == 0.) p1=0.
499 p2 = sign(1., l2) ;
if (l2 == 0.) p2=0.
500 p3 = sign(1., l3) ;
if (l3 == 0.) p3=0.
502 if ( (abs(p0)+abs(p2)) + (abs(p1)+abs(p3)) == abs((p0+p2) + (p1+p3)) )
then 505 end function ispointincell
508 subroutine set_first_direction(G, y_first)
510 integer,
intent(in) :: y_first
512 g%first_direction = y_first
513 end subroutine set_first_direction
516 subroutine get_global_grid_size(G, niglobal, njglobal)
518 integer,
intent(out) :: niglobal
519 integer,
intent(out) :: njglobal
521 call get_global_shape(g%domain, niglobal, njglobal)
523 end subroutine get_global_grid_size
526 subroutine allocate_metrics(G)
528 integer :: isd, ied, jsd, jed, IsdB, IedB, JsdB, JedB, isg, ieg, jsg, jeg
533 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
534 isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
535 isg = g%isg ; ieg = g%ieg ; jsg = g%jsg ; jeg = g%jeg
537 alloc_(g%dxT(isd:ied,jsd:jed)) ; g%dxT(:,:) = 0.0
538 alloc_(g%dxCu(isdb:iedb,jsd:jed)) ; g%dxCu(:,:) = 0.0
539 alloc_(g%dxCv(isd:ied,jsdb:jedb)) ; g%dxCv(:,:) = 0.0
540 alloc_(g%dxBu(isdb:iedb,jsdb:jedb)) ; g%dxBu(:,:) = 0.0
541 alloc_(g%IdxT(isd:ied,jsd:jed)) ; g%IdxT(:,:) = 0.0
542 alloc_(g%IdxCu(isdb:iedb,jsd:jed)) ; g%IdxCu(:,:) = 0.0
543 alloc_(g%IdxCv(isd:ied,jsdb:jedb)) ; g%IdxCv(:,:) = 0.0
544 alloc_(g%IdxBu(isdb:iedb,jsdb:jedb)) ; g%IdxBu(:,:) = 0.0
546 alloc_(g%dyT(isd:ied,jsd:jed)) ; g%dyT(:,:) = 0.0
547 alloc_(g%dyCu(isdb:iedb,jsd:jed)) ; g%dyCu(:,:) = 0.0
548 alloc_(g%dyCv(isd:ied,jsdb:jedb)) ; g%dyCv(:,:) = 0.0
549 alloc_(g%dyBu(isdb:iedb,jsdb:jedb)) ; g%dyBu(:,:) = 0.0
550 alloc_(g%IdyT(isd:ied,jsd:jed)) ; g%IdyT(:,:) = 0.0
551 alloc_(g%IdyCu(isdb:iedb,jsd:jed)) ; g%IdyCu(:,:) = 0.0
552 alloc_(g%IdyCv(isd:ied,jsdb:jedb)) ; g%IdyCv(:,:) = 0.0
553 alloc_(g%IdyBu(isdb:iedb,jsdb:jedb)) ; g%IdyBu(:,:) = 0.0
555 alloc_(g%areaT(isd:ied,jsd:jed)) ; g%areaT(:,:) = 0.0
556 alloc_(g%IareaT(isd:ied,jsd:jed)) ; g%IareaT(:,:) = 0.0
557 alloc_(g%areaBu(isdb:iedb,jsdb:jedb)) ; g%areaBu(:,:) = 0.0
558 alloc_(g%IareaBu(isdb:iedb,jsdb:jedb)) ; g%IareaBu(:,:) = 0.0
560 alloc_(g%mask2dT(isd:ied,jsd:jed)) ; g%mask2dT(:,:) = 0.0
561 alloc_(g%mask2dCu(isdb:iedb,jsd:jed)) ; g%mask2dCu(:,:) = 0.0
562 alloc_(g%mask2dCv(isd:ied,jsdb:jedb)) ; g%mask2dCv(:,:) = 0.0
563 alloc_(g%mask2dBu(isdb:iedb,jsdb:jedb)) ; g%mask2dBu(:,:) = 0.0
564 alloc_(g%geoLatT(isd:ied,jsd:jed)) ; g%geoLatT(:,:) = 0.0
565 alloc_(g%geoLatCu(isdb:iedb,jsd:jed)) ; g%geoLatCu(:,:) = 0.0
566 alloc_(g%geoLatCv(isd:ied,jsdb:jedb)) ; g%geoLatCv(:,:) = 0.0
567 alloc_(g%geoLatBu(isdb:iedb,jsdb:jedb)) ; g%geoLatBu(:,:) = 0.0
568 alloc_(g%geoLonT(isd:ied,jsd:jed)) ; g%geoLonT(:,:) = 0.0
569 alloc_(g%geoLonCu(isdb:iedb,jsd:jed)) ; g%geoLonCu(:,:) = 0.0
570 alloc_(g%geoLonCv(isd:ied,jsdb:jedb)) ; g%geoLonCv(:,:) = 0.0
571 alloc_(g%geoLonBu(isdb:iedb,jsdb:jedb)) ; g%geoLonBu(:,:) = 0.0
573 alloc_(g%dx_Cv(isd:ied,jsdb:jedb)) ; g%dx_Cv(:,:) = 0.0
574 alloc_(g%dy_Cu(isdb:iedb,jsd:jed)) ; g%dy_Cu(:,:) = 0.0
576 alloc_(g%areaCu(isdb:iedb,jsd:jed)) ; g%areaCu(:,:) = 0.0
577 alloc_(g%areaCv(isd:ied,jsdb:jedb)) ; g%areaCv(:,:) = 0.0
578 alloc_(g%IareaCu(isdb:iedb,jsd:jed)) ; g%IareaCu(:,:) = 0.0
579 alloc_(g%IareaCv(isd:ied,jsdb:jedb)) ; g%IareaCv(:,:) = 0.0
581 alloc_(g%bathyT(isd:ied, jsd:jed)) ; g%bathyT(:,:) = 0.0
582 alloc_(g%CoriolisBu(isdb:iedb, jsdb:jedb)) ; g%CoriolisBu(:,:) = 0.0
583 alloc_(g%dF_dx(isd:ied, jsd:jed)) ; g%dF_dx(:,:) = 0.0
584 alloc_(g%dF_dy(isd:ied, jsd:jed)) ; g%dF_dy(:,:) = 0.0
586 alloc_(g%sin_rot(isd:ied,jsd:jed)) ; g%sin_rot(:,:) = 0.0
587 alloc_(g%cos_rot(isd:ied,jsd:jed)) ; g%cos_rot(:,:) = 1.0
589 allocate(g%gridLonT(isg:ieg)) ; g%gridLonT(:) = 0.0
590 allocate(g%gridLonB(g%IsgB:g%IegB)) ; g%gridLonB(:) = 0.0
591 allocate(g%gridLatT(jsg:jeg)) ; g%gridLatT(:) = 0.0
592 allocate(g%gridLatB(g%JsgB:g%JegB)) ; g%gridLatB(:) = 0.0
594 end subroutine allocate_metrics
597 subroutine mom_grid_end(G)
600 dealloc_(g%dxT) ; dealloc_(g%dxCu) ; dealloc_(g%dxCv) ; dealloc_(g%dxBu)
601 dealloc_(g%IdxT) ; dealloc_(g%IdxCu) ; dealloc_(g%IdxCv) ; dealloc_(g%IdxBu)
603 dealloc_(g%dyT) ; dealloc_(g%dyCu) ; dealloc_(g%dyCv) ; dealloc_(g%dyBu)
604 dealloc_(g%IdyT) ; dealloc_(g%IdyCu) ; dealloc_(g%IdyCv) ; dealloc_(g%IdyBu)
606 dealloc_(g%areaT) ; dealloc_(g%IareaT)
607 dealloc_(g%areaBu) ; dealloc_(g%IareaBu)
608 dealloc_(g%areaCu) ; dealloc_(g%IareaCu)
609 dealloc_(g%areaCv) ; dealloc_(g%IareaCv)
611 dealloc_(g%mask2dT) ; dealloc_(g%mask2dCu)
612 dealloc_(g%mask2dCv) ; dealloc_(g%mask2dBu)
614 dealloc_(g%geoLatT) ; dealloc_(g%geoLatCu)
615 dealloc_(g%geoLatCv) ; dealloc_(g%geoLatBu)
616 dealloc_(g%geoLonT) ; dealloc_(g%geoLonCu)
617 dealloc_(g%geoLonCv) ; dealloc_(g%geoLonBu)
619 dealloc_(g%dx_Cv) ; dealloc_(g%dy_Cu)
621 dealloc_(g%bathyT) ; dealloc_(g%CoriolisBu)
622 dealloc_(g%dF_dx) ; dealloc_(g%dF_dy)
623 dealloc_(g%sin_rot) ; dealloc_(g%cos_rot)
625 if (g%bathymetry_at_vel)
then 626 dealloc_(g%Dblock_u) ; dealloc_(g%Dopen_u)
627 dealloc_(g%Dblock_v) ; dealloc_(g%Dopen_v)
630 deallocate(g%gridLonT) ;
deallocate(g%gridLatT)
631 deallocate(g%gridLonB) ;
deallocate(g%gridLatB)
633 deallocate(g%Domain%mpp_domain)
636 end subroutine mom_grid_end
Ocean grid type. See mom_grid for details.
A structure that can be parsed to read and document run-time parameters.
Provides the ocean grid type.
The MOM6 facility to parse input files for runtime parameters.
Defines the horizontal index type (hor_index_type) used for providing index ranges.
An overloaded interface to log the values of various types of parameters.
Container for horizontal index ranges for data, computational and global domains. ...
Describes various unit conversion factors.
Provides a transparent unit rescaling type to facilitate dimensional consistency testing.
Describes the decomposed MOM domain and has routines for communications across PEs.
Routines for error handling and I/O management.
An overloaded interface to log version information about modules.
The MOM_domain_type contains information about the domain decompositoin.
An overloaded interface to read and log the values of various types of parameters.