SURFEX v8.1
General documentation of Surfex
sfx_xios_set_domain.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 SUBROUTINE sfx_xios_set_domain(HGRID, HNAME, KDIM1, KDIM2, KEXT1, KINDEX,&
6  ODMASK, PLON, PLAT, PCORNER_LON, PCORNER_LAT, KMASK)
7 #ifdef WXIOS
8 !!
9 !!
10 !! PURPOSE
11 !! --------
12 !!
13 !!
14 !! Initialize an XIOS domain, representing Surfex packing for a
15 !! tile (or full domain) Declare Surfex grids and masks for XIOS,
16 !! accounting for 2D and 1D geometries
17 !!
18 !!
19 !! IMPLICIT ARGUMENTS :
20 !! --------------------
21 !!
22 !! LXIOS, YXIOS_CONTEXT, TXIOS_CONTEXT, LGAUSS
23 !!
24 !!
25 !! EXTERNAL
26 !! --------
27 !!
28 !! XIOS LIBRARY
29 !!
30 !!
31 !! REFERENCE
32 !! ---------
33 !!
34 !! XIOS Reference guide - Yann Meurdesoif - 10/10/2014 :
35 !! svn co -r 515 http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS/branchs/xios-1.0 <dir> ;
36 !! cd <dir>/doc ; ....
37 !!
38 !! AUTHOR
39 !! ------
40 !!
41 !! S.Sénési, CNRM
42 !!
43 !! MODIFICATION
44 !! --------------
45 !!
46 !! Original 08/2015
47 !!
48 !-------------------------------------------------------------------------------
49 !
50 !* 0. DECLARATIONS
51 ! ------------
52 !-------------------------------------------------------------------------------
53 !
54 USE xios ,ONLY : xios_domain, xios_domaingroup, xios_axisgroup, xios_axis, &
55  xios_get_handle, xios_add_child, xios_set_domain_attr, &
56  xios_is_defined_domain_attr
57 !
58 USE modi_get_surf_grid_dim_n
59 USE modi_latlon_gridtype_lonlat_reg
60 USE modi_abor1_sfx
61 !
62 USE yomhook ,ONLY : lhook, dr_hook
63 USE parkind1 ,ONLY : jprb
64 !
65 IMPLICIT NONE
66 !
67  CHARACTER(LEN=*), INTENT(IN) :: HGRID
68  CHARACTER(LEN=*), INTENT(IN) :: HNAME ! Name to set in XIOS for the Surfex domain/tile
69 INTEGER, INTENT(IN) :: KDIM1 ! Global grid size for dimension 1 (incl. extension zone if any)
70  ! Can be set to O for offline case
71 INTEGER, INTENT(IN) :: KDIM2 ! Global grid size for dimension 2
72 INTEGER, INTENT(IN) :: KEXT1 ! Size of extension zone if any (Aladin : NEXTI)
73  ! Should be O for offline case
74 !
75 INTEGER, INTENT(IN), DIMENSION(:) :: KINDEX ! Index of the MPI-task cells
76  ! in global 1D grid (from 0)
77 LOGICAL, INTENT(IN), DIMENSION(:) :: ODMASK ! mask for the MPI-task cells
78 REAL , INTENT(IN), DIMENSION(:),OPTIONAL :: PLON ! Longitudes for the MPI-task cells
79 REAL , INTENT(IN), DIMENSION(:),OPTIONAL :: PLAT ! Latitudes for the MPI-task cells
80 REAL , INTENT(IN), DIMENSION(:,:),OPTIONAL:: PCORNER_LON, PCORNER_LAT
81 INTEGER, INTENT(IN), DIMENSION(:),OPTIONAL :: KMASK ! Local Surfex packing mask for the tile
82 !
83 TYPE(xios_domaingroup) :: domaingroup_hdl
84 TYPE(xios_domain) :: domain_hdl
85 !
86 INTEGER :: ISIZE ! Number of points for the MPI-task (among all tiles)
87 LOGICAL :: GRECT ! T if rectangular grid (inc Aladin)
88 INTEGER :: JK
89 !
90 INTEGER, DIMENSION(:),ALLOCATABLE :: IINDEX, JINDEX
91 !
92 REAL(KIND=JPRB) :: ZHOOK_HANDLE
93 !
94 IF (lhook) CALL dr_hook('SFX_XIOS_SET_DOMAIN',0,zhook_handle)
95 !
96 !$OMP SINGLE
97 !
98  CALL xios_get_handle("domain_definition",domaingroup_hdl)
99  CALL xios_add_child(domaingroup_hdl,domain_hdl,hname)
100 !
101 isize = SIZE(kindex)
102 !
103 !
104 grect = (kdim2/=1)
105 !
106 IF (grect) THEN
107  !
108  CALL xios_set_domain_attr(hname, ni_glo=kdim1-kext1, nj_glo=kdim2)
109  CALL xios_set_domain_attr(hname, data_dim=1, ibegin=0)
110  CALL xios_set_domain_attr(hname, ni=isize)
111  CALL xios_set_domain_attr(hname, nj=1, data_nj=1) ! To account for XIOS bugs
112  ! Must build i_index and j_index from kindex
113  ALLOCATE(iindex(isize), jindex(isize))
114  !
115  DO jk = 1,isize
116  iindex(jk)=mod(kindex(jk),kdim1-kext1)
117  jindex(jk)=kindex(jk)/(kdim1-kext1)
118  IF (jindex(jk) .GT. kdim2-1 ) &
119  CALL abor1_sfx("SFX_XIOS_SET_DOMAIN : Inconsistent jindex")
120  ENDDO
121  !
122  CALL xios_set_domain_attr(hname, i_index=iindex, j_index=jindex)
123  DEALLOCATE(iindex, jindex)
124  CALL xios_set_domain_attr(hname, mask_1d=odmask)
125  !
126  IF (PRESENT(kmask)) THEN
127  CALL xios_set_domain_attr(hname, data_i_index=kmask(:), data_ni=size(kmask))
128  ENDIF
129  !
130  !
131  ! Process lat/lon and their corners
132  !
133  CALL xios_set_domain_attr(hname, lonvalue_1d=plon,latvalue_1d=plat)
134  IF (hgrid=="LONLAT REG") THEN
135  !
136  CALL xios_set_domain_attr(hname, type='rectilinear')
137  CALL xios_set_domain_attr(hname, lonvalue_1d=plon,latvalue_1d=plat)
138  !
139  !CALL XIOS_SET_DOMAIN_ATTR(HNAME, type='regular')
140  !IDIM=KDIM1*KDIM2
141  !ALLOCATE(ZLAT(IDIM),ZLON(IDIM),ZMESH(IDIM),ZDIR(IDIM))
142  !CALL LATLON_GRIDTYPE_LONLAT_REG(SIZE(UG%XGRID_PAR),IDIM,&
143  ! UG%XGRID_PAR,ZLAT,ZLON,ZMESH,ZDIR)
144  !CALL XIOS_SET_DOMAIN_ATTR(HNAME, lonvalue_1d=ZLON(1:KDIM1-KEXT1))
145  !CALL XIOS_SET_DOMAIN_ATTR(HNAME, latvalue_1d=(/(ZLAT(KK),KK=1,IDIM,KDIM1)/) )
146  !DEALLOCATE(ZLAT,ZLON,ZMESH,ZDIR)
147  CALL xios_set_domain_attr(hname, type='rectilinear')
148  !
149  ELSE
150  IF (hgrid/="CONF PROJ ") &
151  print*,"SFX_XIOS_SET_DOMAIN : Managing "//hgrid//" type grid is not yet tested "
152  !
153  CALL xios_set_domain_attr(hname, type="curvilinear")
154  CALL xios_set_domain_attr(hname, lonvalue_1d=plon,latvalue_1d=plat)
155  IF (PRESENT(pcorner_lat) .AND. (hgrid /='CARTESIAN')) THEN
156  CALL xios_set_domain_attr(hname, nvertex=4, &
157  bounds_lon_1d=pcorner_lon,bounds_lat_1d=pcorner_lat)
158  ENDIF
159  !
160  ENDIF
161  !
162 ELSE
163  ! For 1D global grids (such as Gaussian reduced), just provide
164  ! KINDEX, the local array of global cell indices
165  !
166  CALL xios_set_domain_attr(hname, type='unstructured', data_dim=1, ni_glo=kdim1*kdim2)
167  CALL xios_set_domain_attr(hname, ibegin=0)
168  if (maxval(kindex) > kdim1*kdim2-1 ) CALL abor1_sfx("SFX_XIOS_SET_DOMAIN : maxval(i_index)")
169  if (minval(kindex) < 0 ) CALL abor1_sfx("SFX_XIOS_SET_DOMAIN : minval(i_index)")
170  CALL xios_set_domain_attr(hname, i_index=kindex, ni=size(kindex) )
171  ! CALL XIOS_SET_DOMAIN_ATTR(HNAME, mask_1d=LDMASK)
172  IF (PRESENT(kmask)) THEN
173  !
174  ! Use XIOS 'compression' feature to account for Surfex 'packing'
175  !
176  !write(0,*) 'declaring '//trim(yname)//' with sizes : ',ISIZE,SIZE(KMASK), minval(kindex),maxval(kindex)&
177  ! , minval(kmask),maxval(kmask)
178  !call flush(0)
179  if ( size(kmask) > 0 ) then
180  if (size(kmask) > size(kindex)) CALL abor1_sfx("SFX_XIOS_SET_DOMAIN : size(kmask))")
181  if (maxval(kmask) > size(kindex)-1 ) CALL abor1_sfx("SFX_XIOS_SET_DOMAIN : maxval(data_i_index)")
182  if (minval(kmask) < 0 ) CALL abor1_sfx("SFX_XIOS_SET_DOMAIN : minval(data_i_index)")
183  else
184  !write(0,*) 'zero-size domain '//trim(yname)
185  endif
186  CALL xios_set_domain_attr(hname, data_i_index=kmask, data_ni=size(kmask))
187  !ELSE
188  !write(0,*) 'declaring '//trim(yname)//' with sizes : ',ISIZE, minval(kindex),maxval(kindex)
189  !call flush(0)
190  ENDIF
191  !
192  ! Process lat/lon and their corners
193  !
194  IF (PRESENT(plat) .AND. PRESENT(plon)) THEN
195  CALL xios_set_domain_attr(hname, lonvalue_1d=plon,latvalue_1d=plat)
196  ELSE
197  CALL abor1_sfx("SFX_XIOS_SET_DOMAIN : Must provide lat and lon")
198  ENDIF
199  IF (PRESENT(pcorner_lat) .AND. PRESENT(pcorner_lon) .AND. &
200  (hgrid/='CARTESIAN' )) THEN
201  CALL xios_set_domain_attr(hname, nvertex=4, &
202  bounds_lat_1d=pcorner_lat, bounds_lon_1d=pcorner_lon )
203  ENDIF
204 ENDIF
205 !
206 !$OMP END SINGLE
207 IF (lhook) CALL dr_hook('SFX_XIOS_SET_DOMAIN',1,zhook_handle)
208 !
209 #endif
210 END SUBROUTINE sfx_xios_set_domain
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
integer, parameter jprb
Definition: parkind1.F90:32
subroutine sfx_xios_set_domain(HGRID, HNAME, KDIM1, KDIM2, KEXT1, KINDEX, ODMASK, PLON, PLAT, PCORNER_LON, PCORNER_LAT, KMASK)
logical lhook
Definition: yomhook.F90:15