79 character(len=*),
parameter :: &
83 #include<file_version.h> 85 character(len=*),
parameter :: &
89 integer,
parameter :: &
124 'Can''t determine the version of the grid spec: none of "x_T", "geolon_t", or "ocn_mosaic_file" exist in file "'//trim(
grid_file)//
'"', &
136 character(len=*) :: component
137 integer,
intent(out) :: ntiles
140 character(len=MAX_FILE) :: component_mosaic
147 ntiles = get_mosaic_ntiles(
grid_dir//trim(component_mosaic))
156 character(len=*) :: component
157 integer,
intent(inout) :: nx(:),ny(:)
161 character(len=MAX_NAME) :: varname1, varname2
162 character(len=MAX_FILE) :: component_mosaic
164 varname1 =
'AREA_'//trim(uppercase(component))
165 varname2 = trim(lowercase(component))//
'_mosaic_file' 169 call field_size(
grid_file, varname1, siz)
170 nx(1) = siz(1); ny(1)=siz(2)
173 call get_mosaic_grid_sizes(
grid_dir//trim(component_mosaic),nx,ny)
182 character(len=*) :: component
183 integer,
intent(in) :: tile
184 integer,
intent(inout) :: nx,ny
187 integer,
allocatable :: nnx(:), nny(:)
191 if(tile>0.and.tile<=ntiles)
then 192 allocate(nnx(ntiles),nny(ntiles))
194 nx = nnx(tile); ny = nny(tile)
198 'requested tile index '//trim(
string(tile))//
' is out of bounds (1:'//trim(
string(ntiles))//
')',&
207 character(len=*),
intent(in) :: component
208 integer ,
intent(in) :: tile
209 real ,
intent(inout) :: cellarea(:,:)
210 type(domain2d) ,
intent(in),
optional :: domain
213 integer :: nlon, nlat
214 real,
allocatable :: glonb(:,:), glatb(:,:)
218 select case(trim(component))
221 no_domain=.not.
present(domain), domain=domain)
224 no_domain=.not.
present(domain),domain=domain)
227 'Illegal component name "'//trim(component)//
'": must be one of ATM, LND, or OCN',&
233 if (
present(domain))
then 238 allocate(glonb(nlon+1,nlat+1),glatb(nlon+1,nlat+1))
241 call calc_mosaic_grid_great_circle_area(glonb*
pi/180.0, glatb*
pi/180.0, cellarea)
243 call calc_mosaic_grid_area(glonb*
pi/180.0, glatb*
pi/180.0, cellarea)
245 deallocate(glonb,glatb)
254 character(len=*) :: component
255 integer,
intent(in) :: tile
256 real,
intent(inout) :: area(:,:)
257 type(domain2d),
intent(in),
optional :: domain
259 integer :: n_xgrid_files
260 integer :: siz(4), nxgrid
262 integer,
allocatable :: i1(:), j1(:), i2(:), j2(:)
263 real,
allocatable :: xgrid_area(:)
264 real,
allocatable :: rmask(:,:)
265 character(len=MAX_NAME) :: &
272 character(len=4096) :: attvalue
273 character(len=MAX_NAME),
allocatable :: nest_tile_name(:)
274 character(len=MAX_NAME) :: varname1, varname2
275 integer :: is,ie,js,je
277 integer :: num_nest_tile, ntiles
279 integer :: found_xgrid_files
280 integer :: ibegin, iend, bsize, l
284 select case(component)
286 call read_data(
grid_file,
'AREA_ATM',area, no_domain=.not.
present(domain),domain=domain)
288 allocate(rmask(
size(area,1),
size(area,2)))
289 call read_data(
grid_file,
'AREA_OCN',area, no_domain=.not.
present(domain),domain=domain)
294 call read_data(
grid_file,
'AREA_LND',area,no_domain=.not.
present(domain),domain=domain)
297 'Illegal component name "'//trim(component)//
'": must be one of ATM, LND, or OCN',&
301 select case (component)
307 xgrid_name =
'aXl_file' 309 tile_name = trim(mosaic_name)//
'_tile'//char(tile+ichar(
'0'))
311 xgrid_name =
'aXo_file' 313 tile_name = trim(mosaic_name)//
'_tile'//char(tile+ichar(
'0'))
316 'Illegal component name "'//trim(component)//
'": must be one of ATM, LND, or OCN',&
320 if(
present(domain))
then 328 if (
size(area,1)/=ie-is+1.or.
size(area,2)/=je-js+1) &
330 'size of the output argument "area" is not consistent with the domain',fatal)
335 mosaic_file =
grid_dir//trim(mosaic_file)
336 ntiles = get_mosaic_ntiles(trim(mosaic_file))
337 allocate(nest_tile_name(ntiles))
340 call read_data(mosaic_file,
'gridfiles', tilefile, level=n)
343 if(trim(attvalue) ==
"TRUE")
then 344 num_nest_tile = num_nest_tile + 1
345 nest_tile_name(num_nest_tile) = trim(mosaic_name)//
'_tile'//char(n+ichar(
'0'))
346 else if(trim(attvalue) .NE.
"FALSE")
then 347 call error_mesg(
module_name//
'/get_grid_comp_area',
'value of global attribute nest_grid in file'// &
348 trim(tilefile)//
' should be TRUE of FALSE', fatal)
355 call field_size(
grid_file,xgrid_name,siz)
356 n_xgrid_files = siz(2)
357 found_xgrid_files = 0
359 do n = 1, n_xgrid_files
364 if(n_xgrid_files>1)
then 365 if(index(xgrid_file,trim(tile_name))==0) cycle
367 found_xgrid_files = found_xgrid_files + 1
370 do m = 1, num_nest_tile
371 if(index(xgrid_file, trim(nest_tile_name(m))) .NE. 0)
then 379 nxgrid = get_mosaic_xgrid_size(
grid_dir//xgrid_file)
381 allocate(i1(nxgrid), j1(nxgrid), i2(nxgrid), j2(nxgrid), xgrid_area(nxgrid))
388 iend = ibegin + bsize - 1
389 call get_mosaic_xgrid(
grid_dir//xgrid_file, i1(1:bsize), j1(1:bsize), i2(1:bsize), j2(1:bsize), &
390 xgrid_area(1:bsize), ibegin, iend)
394 if (i<is.or.i>ie) cycle
395 if (j<js.or.j>je) cycle
396 area(i+i0,j+j0) = area(i+i0,j+j0) + xgrid_area(m)
400 deallocate(i1, j1, i2, j2, xgrid_area)
402 if (found_xgrid_files == 0) &
403 call error_mesg(
'get_grid_comp_area',
'no xgrid files were found for component '&
404 //trim(component)//
' (mosaic name is '//trim(mosaic_name)//
')', fatal)
407 deallocate(nest_tile_name)
415 character(len=*),
intent(in) :: component
416 integer ,
intent(in) :: tile
417 real ,
intent(inout) :: cellarea(:)
418 type(domain2d) ,
intent(in) :: SG_domain
419 type(domainUG) ,
intent(in) :: UG_domain
420 integer :: is, ie, js, je
421 real,
allocatable :: SG_area(:,:)
424 allocate(sg_area(is:ie, js:je))
432 character(len=*),
intent(in) :: component
433 integer ,
intent(in) :: tile
434 real ,
intent(inout) :: area(:)
435 type(domain2d) ,
intent(in) :: SG_domain
436 type(domainUG) ,
intent(in) :: UG_domain
437 integer :: is, ie, js, je
438 real,
allocatable :: SG_area(:,:)
441 allocate(sg_area(is:ie, js:je))
457 character(len=*),
intent(in) :: component
458 integer,
intent(in) :: tile
459 real,
intent(inout) :: glonb(:),glatb(:)
461 integer :: nlon, nlat
462 integer :: start(4), nread(4)
463 real,
allocatable :: tmp(:,:), x_vert_t(:,:,:), y_vert_t(:,:,:)
464 character(len=MAX_FILE) :: filename1, filename2
467 if (
size(glonb(:))/=nlon+1) &
469 'Size of argument "glonb" is not consistent with the grid size',fatal)
470 if (
size(glatb(:))/=nlat+1) &
472 'Size of argument "glatb" is not consistent with the grid size',fatal)
473 if(trim(component) .NE.
'ATM' .AND. component .NE.
'LND' .AND. component .NE.
'OCN')
then 475 'Illegal component name "'//trim(component)//
'": must be one of ATM, LND, or OCN',&
481 select case(trim(component))
490 select case(trim(component))
495 allocate (x_vert_t(nlon,1,2), y_vert_t(1,nlat,2) )
497 nread(1) = nlon; nread(2) = 1; start(3) = 1
498 call read_data(
grid_file,
"x_vert_T", x_vert_t(:,:,1), start, nread, no_domain=.true.)
499 nread(1) = nlon; nread(2) = 1; start(3) = 2
500 call read_data(
grid_file,
"x_vert_T", x_vert_t(:,:,2), start, nread, no_domain=.true.)
502 nread(1) = 1; nread(2) = nlat; start(3) = 1
503 call read_data(
grid_file,
"y_vert_T", y_vert_t(:,:,1), start, nread, no_domain=.true.)
504 nread(1) = 1; nread(2) = nlat; start(3) = 4
505 call read_data(
grid_file,
"y_vert_T", y_vert_t(:,:,2), start, nread, no_domain=.true.)
506 glonb(1:nlon) = x_vert_t(1:nlon,1,1)
507 glonb(nlon+1) = x_vert_t(nlon,1,2)
508 glatb(1:nlat) = y_vert_t(1,1:nlat,1)
509 glatb(nlat+1) = y_vert_t(1,nlat,2)
510 deallocate(x_vert_t, y_vert_t)
517 call read_data(filename1,
'gridfiles', filename2, level=tile)
518 filename2 =
grid_dir//trim(filename2)
522 allocate( tmp(2*nlon+1,1) )
523 call read_data(filename2,
"x", tmp, start, nread, no_domain=.true.)
524 glonb(1:nlon+1) = tmp(1:2*nlon+1:2,1)
526 allocate(tmp(1,2*nlat+1))
530 call read_data(filename2,
"y", tmp, start, nread, no_domain=.true.)
531 glatb(1:nlat+1) = tmp(1,1:2*nlat+1:2)
541 character(len=*),
intent(in) :: component
542 integer,
intent(in) :: tile
543 real,
intent(inout) :: lonb(:,:),latb(:,:)
544 type(domain2d),
optional,
intent(in) :: domain
547 character(len=MAX_FILE) :: filename1, filename2
548 integer :: nlon, nlat
550 real,
allocatable :: buffer(:), tmp(:,:), x_vert_t(:,:,:), y_vert_t(:,:,:)
551 integer :: is,ie,js,je
554 integer :: start(4), nread(4)
557 if (
present(domain))
then 564 'domain is not present, global data will be read', note)
566 i0 = -is+1; j0 = -js+1
569 if (
size(lonb,1)/=ie-is+2.or.
size(lonb,2)/=je-js+2) &
571 'Size of argument "lonb" is not consistent with the domain size',fatal)
572 if (
size(latb,1)/=ie-is+2.or.
size(latb,2)/=je-js+2) &
574 'Size of argument "latb" is not consistent with the domain size',fatal)
575 if(trim(component) .NE.
'ATM' .AND. component .NE.
'LND' .AND. component .NE.
'OCN')
then 577 'Illegal component name "'//trim(component)//
'": must be one of ATM, LND, or OCN',&
583 select case(component)
585 allocate(buffer(
max(nlon,nlat)+1))
587 call read_data(
grid_file,
'xb'//lowercase(component(1:1)), buffer(1:nlon+1), no_domain=.true.)
590 lonb(i+i0,j+j0) = buffer(i)
593 call read_data(
grid_file,
'yb'//lowercase(component(1:1)), buffer(1:nlat+1), no_domain=.true.)
596 latb(i+i0,j+j0) = buffer(j)
601 if (
present(domain))
then 603 start(1) = is; start(2) = js
604 nread(1) = ie-is+2; nread(2) = je-js+2
613 select case(component)
615 allocate(buffer(
max(nlon,nlat)+1))
617 call read_data(
grid_file,
'xb'//lowercase(component(1:1)), buffer(1:nlon+1), no_domain=.true.)
620 lonb(i+i0,j+j0) = buffer(i)
623 call read_data(
grid_file,
'yb'//lowercase(component(1:1)), buffer(1:nlat+1), no_domain=.true.)
626 latb(i+i0,j+j0) = buffer(j)
631 nlon=ie-is+1; nlat=je-js+1
632 allocate (x_vert_t(nlon,nlat,4), y_vert_t(nlon,nlat,4) )
633 call read_data(
grid_file,
'x_vert_T', x_vert_t, no_domain=.not.
present(domain), domain=domain )
634 call read_data(
grid_file,
'y_vert_T', y_vert_t, no_domain=.not.
present(domain), domain=domain )
635 lonb(1:nlon,1:nlat) = x_vert_t(1:nlon,1:nlat,1)
636 lonb(nlon+1,1:nlat) = x_vert_t(nlon,1:nlat,2)
637 lonb(1:nlon,nlat+1) = x_vert_t(1:nlon,nlat,4)
638 lonb(nlon+1,nlat+1) = x_vert_t(nlon,nlat,3)
639 latb(1:nlon,1:nlat) = y_vert_t(1:nlon,1:nlat,1)
640 latb(nlon+1,1:nlat) = y_vert_t(nlon,1:nlat,2)
641 latb(1:nlon,nlat+1) = y_vert_t(1:nlon,nlat,4)
642 latb(nlon+1,nlat+1) = y_vert_t(nlon,nlat,3)
643 deallocate(x_vert_t, y_vert_t)
650 call read_data(filename1,
'gridfiles', filename2, level=tile)
651 filename2 =
grid_dir//trim(filename2)
652 if(
PRESENT(domain))
then 655 start(1) = 2*(is-isg+1) - 1; nread(1) = 2*(ie-is)+3
656 start(2) = 2*(js-jsg+1) - 1; nread(2) = 2*(je-js)+3
657 allocate(tmp(nread(1), nread(2)) )
658 call read_data(filename2,
'x', tmp, start, nread, no_domain=.true.)
661 lonb(i,j) = tmp(2*i-1,2*j-1)
664 call read_data(filename2,
'y', tmp, start, nread, no_domain=.true.)
667 latb(i,j) = tmp(2*i-1,2*j-1)
671 allocate(tmp(2*nlon+1,2*nlat+1))
672 call read_data(filename2,
'x', tmp, no_domain=.true.)
675 lonb(i+i0,j+j0) = tmp(2*i-1,2*j-1)
678 call read_data(filename2,
'y', tmp, no_domain=.true.)
681 latb(i+i0,j+j0) = tmp(2*i-1,2*j-1)
692 character(len=*),
intent(in) :: component
693 integer,
intent(in) :: tile
694 real,
intent(inout) :: lonb(:,:),latb(:,:)
695 type(domain2d) ,
intent(in) :: SG_domain
696 type(domainUG) ,
intent(in) :: UG_domain
697 integer :: is, ie, js, je, i, j
698 real,
allocatable :: SG_lonb(:,:), SG_latb(:,:), tmp(:,:,:)
701 allocate(sg_lonb(is:ie+1, js:je+1))
702 allocate(sg_latb(is:ie+1, js:je+1))
703 allocate(tmp(is:ie,js:je,4))
707 tmp(i,j,1) = sg_lonb(i,j)
708 tmp(i,j,2) = sg_lonb(i+1,j)
709 tmp(i,j,3) = sg_lonb(i+1,j+1)
710 tmp(i,j,4) = sg_lonb(i,j+1)
716 tmp(i,j,1) = sg_latb(i,j)
717 tmp(i,j,2) = sg_latb(i+1,j)
718 tmp(i,j,3) = sg_latb(i+1,j+1)
719 tmp(i,j,4) = sg_latb(i,j+1)
725 deallocate(sg_lonb, sg_latb, tmp)
736 character(len=*),
intent(in) :: component
737 integer,
intent(in) :: tile
738 real,
intent(inout) :: glon(:),glat(:)
739 integer :: nlon, nlat
740 integer :: start(4), nread(4)
741 real,
allocatable :: tmp(:,:)
742 character(len=MAX_FILE) :: filename1, filename2
745 if (
size(glon(:))/=nlon) &
747 'Size of argument "glon" is not consistent with the grid size',fatal)
748 if (
size(glat(:))/=nlat) &
750 'Size of argument "glat" is not consistent with the grid size',fatal)
751 if(trim(component) .NE.
'ATM' .AND. component .NE.
'LND' .AND. component .NE.
'OCN')
then 753 'Illegal component name "'//trim(component)//
'": must be one of ATM, LND, or OCN',&
759 select case(trim(component))
768 select case(trim(component))
781 call read_data(filename1,
'gridfiles', filename2, level=tile)
782 filename2 =
grid_dir//trim(filename2)
785 nread(1) = 2*nlon+1; start(2) = 2
786 allocate( tmp(2*nlon+1,1) )
787 call read_data(filename2,
"x", tmp, start, nread, no_domain=.true.)
788 glon(1:nlon) = tmp(2:2*nlon:2,1)
790 allocate(tmp(1, 2*nlat+1))
793 nread(2) = 2*nlat+1; start(1) = 2
794 call read_data(filename2,
"y", tmp, start, nread, no_domain=.true.)
795 glat(1:nlat) = tmp(1,2:2*nlat:2)
806 character(len=*),
intent(in) :: component
807 integer,
intent(in) :: tile
808 real,
intent(inout) :: lon(:,:),lat(:,:)
809 type(domain2d),
intent(in),
optional :: domain
811 character(len=MAX_NAME) :: varname
812 character(len=MAX_FILE) :: filename1, filename2
813 integer :: nlon, nlat
815 real,
allocatable :: buffer(:),tmp(:,:)
816 integer :: is,ie,js,je
819 integer :: start(4), nread(4)
822 if (
present(domain))
then 829 'domain is not present, global data will be read', note)
831 i0 = -is+1; j0 = -js+1
834 if (
size(lon,1)/=ie-is+1.or.
size(lon,2)/=je-js+1) &
836 'Size of array "lon" is not consistent with the domain size',&
838 if (
size(lat,1)/=ie-is+1.or.
size(lat,2)/=je-js+1) &
840 'Size of array "lat" is not consistent with the domain size',&
842 if(trim(component) .NE.
'ATM' .AND. component .NE.
'LND' .AND. component .NE.
'OCN')
then 844 'Illegal component name "'//trim(component)//
'": must be one of ATM, LND, or OCN',&
850 select case (trim(component))
852 allocate(buffer(
max(nlon,nlat)))
854 call read_data(
grid_file,
'xt'//lowercase(component(1:1)), buffer(1:nlon), no_domain=.true.)
857 lon(i+i0,j+j0) = buffer(i)
860 call read_data(
grid_file,
'yt'//lowercase(component(1:1)), buffer(1:nlat), no_domain=.true.)
863 lat(i+i0,j+j0) = buffer(j)
868 call read_data(
grid_file,
'geolon_t', lon, no_domain=.not.
present(domain), domain=domain )
869 call read_data(
grid_file,
'geolat_t', lat, no_domain=.not.
present(domain), domain=domain )
872 select case(trim(component))
874 allocate(buffer(
max(nlon,nlat)))
876 call read_data(
grid_file,
'xt'//lowercase(component(1:1)), buffer(1:nlon), no_domain=.true.)
879 lon(i+i0,j+j0) = buffer(i)
882 call read_data(
grid_file,
'yt'//lowercase(component(1:1)), buffer(1:nlat), no_domain=.true.)
885 lat(i+i0,j+j0) = buffer(j)
898 call read_data(filename1,
'gridfiles', filename2, level=tile)
899 filename2 =
grid_dir//trim(filename2)
900 if(
PRESENT(domain))
then 903 start(1) = 2*(is-isg+1) - 1; nread(1) = 2*(ie-is)+3
904 start(2) = 2*(js-jsg+1) - 1; nread(2) = 2*(je-js)+3
905 allocate(tmp(nread(1), nread(2)))
906 call read_data(filename2,
'x', tmp, start, nread, no_domain=.true.)
909 lon(i,j) = tmp(2*i,2*j)
912 call read_data(filename2,
'y', tmp, start, nread, no_domain=.true.)
915 lat(i,j) = tmp(2*i,2*j)
919 allocate(tmp(2*nlon+1,2*nlat+1))
920 call read_data(filename2,
'x', tmp, no_domain=.true.)
923 lon(i+i0,j+j0) = tmp(2*i,2*j)
926 call read_data(filename2,
'y', tmp, no_domain=.true.)
929 lat(i+i0,j+j0) = tmp(2*i,2*j)
939 character(len=*),
intent(in) :: component
940 integer,
intent(in) :: tile
941 real,
intent(inout) :: lon(:),lat(:)
942 type(domain2d) ,
intent(in) :: SG_domain
943 type(domainUG) ,
intent(in) :: UG_domain
944 integer :: is, ie, js, je
945 real,
allocatable :: SG_lon(:,:), SG_lat(:,:)
948 allocate(sg_lon(is:ie, js:je))
949 allocate(sg_lat(is:ie, js:je))
953 deallocate(sg_lon, sg_lat)
963 character(len=*) ,
intent(in) :: component
964 type(
domain2d) ,
intent(inout) :: domain
965 integer ,
intent(in) :: layout(2)
966 integer,
optional,
intent(in) :: halo
967 logical,
optional,
intent(in) :: maskmap(:,:,:)
972 character(len=MAX_NAME) :: varname
973 character(len=MAX_FILE) :: mosaic_file
977 integer :: ng, pe_pos, npes
978 integer,
allocatable :: nlon(:), nlat(:), global_indices(:,:)
979 integer,
allocatable :: pe_start(:), pe_end(:), layout_2d(:,:)
980 integer,
allocatable :: tile1(:),tile2(:)
981 integer,
allocatable :: is1(:),ie1(:),js1(:),je1(:)
982 integer,
allocatable :: is2(:),ie2(:),js2(:),je2(:)
985 allocate(nlon(ntiles), nlat(ntiles))
986 allocate(global_indices(4,ntiles))
987 allocate(pe_start(ntiles),pe_end(ntiles))
988 allocate(layout_2d(2,ntiles))
991 pe_pos = mpp_root_pe()
993 global_indices(:,n) = (/ 1, nlon(n), 1, nlat(n) /)
994 layout_2d(:,n) = layout
995 if(
present(maskmap))
then 996 npes = count(maskmap(:,:,n))
998 npes = layout(1)*layout(2)
1000 pe_start(n) = pe_pos
1001 pe_end(n) = pe_pos + npes - 1
1002 pe_pos = pe_end(n) + 1
1005 varname=trim(lowercase(component))//
'_mosaic_file' 1007 mosaic_file =
grid_dir//mosaic_file
1011 allocate(tile1(ncontacts),tile2(ncontacts))
1012 allocate(is1(ncontacts),ie1(ncontacts),js1(ncontacts),je1(ncontacts))
1013 allocate(is2(ncontacts),ie2(ncontacts),js2(ncontacts),je2(ncontacts))
1015 is1, ie1, js1, je1, is2, ie2, js2, je2)
1018 if(
present(halo)) ng = halo
1020 call mpp_define_mosaic ( global_indices, layout_2d, domain, &
1021 ntiles, ncontacts, tile1, tile2, &
1022 is1, ie1, js1, je1, &
1023 is2, ie2, js2, je2, &
1024 pe_start=pe_start, pe_end=pe_end, symmetry=.true., &
1025 shalo = ng, nhalo = ng, whalo = ng, ehalo = ng, &
1026 maskmap = maskmap, &
1027 name = trim(component)//
'Cubic-Sphere Grid' )
1029 deallocate(nlon,nlat,global_indices,pe_start,pe_end,layout_2d)
1030 deallocate(tile1,tile2)
1031 deallocate(is1,ie1,js1,je1)
1032 deallocate(is2,ie2,js2,je2)
subroutine get_grid_cell_vertices_ug(component, tile, lonb, latb, SG_domain, UG_domain)
subroutine, public get_mosaic_contact(mosaic_file, tile1, tile2, istart1, iend1, jstart1, jend1, istart2, iend2, jstart2, jend2)
logical function, public get_great_circle_algorithm()
real, parameter, public radius
Radius of the Earth [m].
integer, parameter version_0
subroutine, public define_cube_mosaic(component, domain, layout, halo, maskmap)
character(len= *), parameter grid_dir
subroutine get_grid_size_for_one_tile(component, tile, nx, ny)
integer, parameter bufsize
subroutine, public calc_mosaic_grid_great_circle_area(lon, lat, area)
character(len= *), parameter grid_file
subroutine get_grid_cell_vertices_2d(component, tile, lonb, latb, domain)
subroutine get_grid_cell_area_ug(component, tile, cellarea, SG_domain, UG_domain)
subroutine get_grid_cell_area_sg(component, tile, cellarea, domain)
integer function, public get_mosaic_ntiles(mosaic_file)
integer, parameter max_file
subroutine get_grid_cell_centers_1d(component, tile, glon, glat)
subroutine, public get_mosaic_grid_sizes(mosaic_file, nx, ny)
integer, parameter version_2
subroutine, public get_mosaic_xgrid(xgrid_file, i1, j1, i2, j2, area, ibegin, iend)
subroutine, public calc_mosaic_grid_area(lon, lat, area)
subroutine get_grid_comp_area_sg(component, tile, area, domain)
integer, parameter max_name
int field_exist(const char *file, const char *name)
logical great_circle_algorithm
integer, parameter version_1
subroutine, public get_grid_ntiles(component, ntiles)
integer function, public get_mosaic_ncontacts(mosaic_file)
character(len= *), parameter module_name
subroutine get_grid_comp_area_ug(component, tile, area, SG_domain, UG_domain)
subroutine get_grid_cell_centers_2d(component, tile, lon, lat, domain)
integer function get_grid_version()
integer function, public get_mosaic_xgrid_size(xgrid_file)
subroutine get_grid_size_for_all_tiles(component, nx, ny)
subroutine get_grid_cell_vertices_1d(component, tile, glonb, glatb)
subroutine get_grid_cell_centers_ug(component, tile, lon, lat, SG_domain, UG_domain)
subroutine, public error_mesg(routine, message, level)
real(fp), parameter, public pi