SURFEX v8.1
General documentation of Surfex
ol_define_dim.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 ol_define_dim (UG, KSIZE_FULL, HPROGRAM, KLUOUT, KNI, &
6  KDIM1, HUNIT1, HUNIT2, PX, PY, KDIMS, &
7  KDDIM, HNAME_DIM, KNPATCH, KNSNLAYER, PLAT, PLON)
8 ! #######################################################
9 !!**** *OL_DEFINE_DIM* -
10 !!
11 !! PURPOSE
12 !! -------
13 !!
14  !!
15 !!** METHOD
16 !! ------
17 !!
18 !! EXTERNAL
19 !! --------
20 !!
21 !!
22 !! IMPLICIT ARGUMENTS
23 !! ------------------
24 !!
25 !! REFERENCE
26 !! ---------
27 !!
28 !!
29 !! AUTHOR
30 !! ------
31 !! S. Faroux *Meteo France*
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !! Original 06/2010
36 !! 07/2011 add specific computation for IGN grid (B. Decharme)
37 !! 09/2015 M. Lafaysse : snow layer dimension
38 !-------------------------------------------------------------------------------
39 !
41 !
42 USE modd_io_surf_ol, ONLY: nmask_ign
43 !
44 USE modn_io_offline, ONLY : lwrite_coord
45 !
46 USE modi_get_grid_dim
47 USE modi_get_grid_coord
48 USE modi_get_ign_maskall
49 !
57 !
58 USE yomhook ,ONLY : lhook, dr_hook
59 USE parkind1 ,ONLY : jprb
60 !
61 USE netcdf
62 !
63 IMPLICIT NONE
64 !
65 !
66 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
67 !
68 INTEGER, INTENT(IN) :: KSIZE_FULL
69 !
70  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM
71 INTEGER, INTENT(IN) :: KLUOUT
72 INTEGER, INTENT(IN) :: KNI
73 INTEGER, INTENT(OUT) :: KDIM1
74  CHARACTER(LEN=13) , DIMENSION(:), INTENT(OUT) :: HUNIT1, HUNIT2
75 !
76 REAL,DIMENSION(:), POINTER :: PX, PY
77 INTEGER, DIMENSION(:), POINTER :: KDIMS, KDDIM
78  CHARACTER(LEN=100), DIMENSION(:), POINTER :: HNAME_DIM
79 INTEGER, OPTIONAL, INTENT(IN) :: KNPATCH
80 INTEGER, OPTIONAL, INTENT(IN) :: KNSNLAYER
81 REAL, DIMENSION(:), OPTIONAL, POINTER :: PLAT, PLON
82 !
83 REAL, DIMENSION(:), ALLOCATABLE :: ZXFULL, ZYFULL, ZDXFULL, ZDYFULL, ZLAT_XY, ZLON_XY
84 REAL, DIMENSION(KNI) :: ZXX, ZYY
85 REAL :: ZLAT0,ZLON0,ZRPK,ZBETA,ZLATOR,ZLONOR,ZCODIL,&
86  ZLAPO,ZLOPO
87  CHARACTER(LEN=3) :: YTYPE
88 INTEGER, DIMENSION(:), ALLOCATABLE :: INLOPA
89 INTEGER :: JJ, ILAMBERT, IFULL, IDIM1, IL, IIMAX, IJMAX
90 INTEGER :: INDIMS, INDIMSMAX, IDIM2, INLATI
91 INTEGER :: INSNLAYER, INPATCH, ID
92 LOGICAL :: GRECT ! T if rectangular grid
93 REAL(KIND=JPRB) :: ZHOOK_HANDLE
94 !
95 IF (lhook) CALL dr_hook('OL_DEFINE_DIM',0,zhook_handle)
96 !
97 NULLIFY(px)
98 NULLIFY(py)
99 !
100 insnlayer = 0
101 IF (PRESENT(knsnlayer)) insnlayer = knsnlayer
102 !
103 inpatch = 0
104 IF (PRESENT(knpatch)) inpatch = knpatch
105 !
106 kdim1 = 0
107 idim2 = 0
108 !
109 ytype='XY '
110 IF (ug%G%CGRID.EQ.'LONLAT REG'.OR.ug%G%CGRID.EQ.'LONLATVAL '.OR.ug%G%CGRID.EQ.'LONLAT ROT') ytype='LON'
111 !
112 IF (.NOT.lwrite_coord) THEN
113  !
114  IF ( ug%G%CGRID.EQ.'CONF PROJ ' .OR. ug%G%CGRID.EQ.'CARTESIAN '&
115  .OR. ug%G%CGRID.EQ.'LONLAT REG' .OR. ug%G%CGRID.EQ.'IGN' ) THEN
116  IF (ASSOCIATED(ug%XGRID_FULL_PAR)) THEN
117  CALL get_grid_dim(ug%G%CGRID,ug%NGRID_FULL_PAR,ug%XGRID_FULL_PAR,grect,kdim1,idim2)
118  ELSEIF (ASSOCIATED(ug%G%XGRID_PAR)) THEN
119  CALL get_grid_dim(ug%G%CGRID,ug%G%NGRID_PAR,ug%G%XGRID_PAR,grect,kdim1,idim2)
120  ENDIF
121  ENDIF
122  !
123 ENDIF
124 !
125 IF ( ug%G%CGRID.EQ.'IGN' ) CALL get_gridtype_ign(ug%XGRID_FULL_PAR,kl=il,kdimx=iimax,kdimy=ijmax)
126 !
127 indims = 0
128 IF ( inpatch/=0 .AND. insnlayer/=0 ) THEN
129  indims = 2
130 ELSEIF ( inpatch/=0 .OR. insnlayer/=0 ) THEN
131  indims = 1
132 ENDIF
133 !
134 !
135 ! case LWRITE_COORD = F and regular grid
136 IF ( kdim1.NE.0 ) THEN
137  indims = indims + 3
138 ELSEIF ( ug%G%CGRID=="GAUSS " ) THEN
139  indims = indims + 4
140 ELSEIF (ug%G%CGRID/="LONLATVAL ".AND.(ug%G%CGRID/="IGN ".OR.iimax*ijmax==il) ) THEN
141  indims = indims + 4
142 ELSE
143  indims = indims + 2
144 ENDIF
145 !
146 ALLOCATE(kdims(indims))
147 ALLOCATE(kddim(indims))
148 ALLOCATE(hname_dim(indims))
149 !
150 ! case LWRITE_COORD = F and regular grid
151 IF ( kdim1.NE.0 ) THEN
152 
153  kdims(1) = kdim1
154  kdims(2) = idim2
155  IF (ytype.EQ.'LON') THEN
156  hname_dim(1) = 'lon'
157  hname_dim(2) = 'lat'
158  hunit1(1) = 'degrees_east'
159  hunit2(1) = 'degrees_north'
160  ELSE
161  hname_dim(1) = 'xx'
162  hname_dim(2) = 'yy'
163  hunit1(1) = 'meters'
164  hunit2(1) = 'meters'
165  ENDIF
166  ALLOCATE(px(kdim1))
167  ALLOCATE(py(idim2))
168  idim1 = kdim1
169  ifull = kdim1*idim2
170 
171 ! case LWRITE_COORD = T
172 ELSE
173 
174  kdims(1) = kni
175  hname_dim(1) = 'Number_of_points'
176 
177  IF (ug%G%CGRID=="GAUSS ") THEN
178 
179  hname_dim(2) = "latitude"
180  hname_dim(3) = "longitude"
181  hunit1(1) = 'degrees_east'
182  hunit2(1) = 'degrees_north'
183  CALL get_gridtype_gauss(ug%XGRID_FULL_PAR,knlati=inlati)
184  ALLOCATE(inlopa(inlati))
185  CALL get_gridtype_gauss(ug%XGRID_FULL_PAR,knlopa=inlopa)
186  kdims(2) = inlati
187  kdims(3) = maxval(inlopa)
188  DEALLOCATE(inlopa)
189 
190  ELSEIF (ug%G%CGRID/="LONLATVAL ".AND.(ug%G%CGRID/="IGN ".OR.iimax*ijmax==il)) THEN
191 
192  IF (ytype.EQ.'LON') THEN
193  hname_dim(2) = 'lon'
194  hname_dim(3) = 'lat'
195  hunit1(1) = 'degrees_east'
196  hunit2(1) = 'degrees_north'
197  ELSE
198  hname_dim(2) = 'xx'
199  hname_dim(3) = 'yy'
200  hunit1(1) = 'meters'
201  hunit2(1) = 'meters'
202 
203  ENDIF
204 
205  IF (ug%G%CGRID=="CONF PROJ ") THEN
206  CALL get_gridtype_conf_proj(ug%XGRID_FULL_PAR,kimax=iimax,kjmax=ijmax)
207  ELSEIF(ug%G%CGRID=="CARTESIAN ") THEN
208  CALL get_gridtype_cartesian(ug%XGRID_FULL_PAR,kimax=iimax,kjmax=ijmax)
209  ELSEIF(ug%G%CGRID=="LONLAT REG") THEN
210  CALL get_gridtype_lonlat_reg(ug%XGRID_FULL_PAR,klon=iimax,klat=ijmax)
211  ELSEIF(ug%G%CGRID=="LONLATROT ") THEN
212  CALL get_gridtype_lonlat_rot(ug%XGRID_FULL_PAR,klon=iimax,klat=ijmax)
213  ENDIF
214 
215  kdims(2) = iimax
216  kdims(3) = ijmax
217 
218  ENDIF
219 
220  IF (lwrite_coord) THEN
221  ALLOCATE(px(kni))
222  ALLOCATE(py(kni))
223  ENDIF
224  idim1 = kni
225  idim2 = kni
226  ifull = kni
227 
228 ENDIF
229 !
230 !
231 IF (lwrite_coord) THEN
232  !
233  IF (ASSOCIATED(ug%XGRID_FULL_PAR)) THEN
234  CALL get_grid_coord(ug%G%CGRID, ug%G%NGRID_PAR, ug%G%XGRID_PAR, ksize_full, &
235  kluout,px=px,py=py,kl=kni,hgrid=ug%G%CGRID,pgrid_par=ug%XGRID_FULL_PAR)
236  ELSEIF (ASSOCIATED(ug%G%XGRID_PAR)) THEN
237  CALL get_grid_coord(ug%G%CGRID, ug%G%NGRID_PAR, ug%G%XGRID_PAR, ksize_full, &
238  kluout,px=px,py=py,kl=kni,hgrid=ug%G%CGRID,pgrid_par=ug%G%XGRID_PAR)
239  ENDIF
240  !
241 ELSEIF ( ug%G%CGRID.EQ.'CONF PROJ '.OR. ug%G%CGRID.EQ.'CARTESIAN '.OR. &
242  ug%G%CGRID.EQ.'LONLAT REG' ) THEN
243  !
244  IF (ASSOCIATED(ug%XGRID_FULL_PAR)) THEN
245  CALL get_grid_coord(ug%G%CGRID, ug%G%NGRID_PAR, ug%G%XGRID_PAR, ksize_full, &
246  kluout,px=zxx,py=zyy,kl=kni,hgrid=ug%G%CGRID,pgrid_par=ug%XGRID_FULL_PAR)
247  ELSEIF (ASSOCIATED(ug%G%XGRID_PAR)) THEN
248  CALL get_grid_coord(ug%G%CGRID, ug%G%NGRID_PAR, ug%G%XGRID_PAR, ksize_full, &
249  kluout,px=zxx,py=zyy,kl=kni,hgrid=ug%G%CGRID,pgrid_par=ug%G%XGRID_PAR)
250  ENDIF
251  !
252  IF (ASSOCIATED(px)) THEN
253  DO jj=1,SIZE(px)
254  px(jj)=zxx(jj)
255  ENDDO
256  ENDIF
257  IF (ASSOCIATED(py)) THEN
258  DO jj=1,SIZE(py)
259  py(jj)=zyy((jj-1)*(kni/SIZE(py))+1)
260  ENDDO
261  ENDIF
262 !
263 ELSEIF(ug%G%CGRID.EQ.'IGN ')THEN
264  !
265  CALL get_ign_maskall(ug, kni, px, py)
266  !
267 ENDIF
268 !
269 IF (PRESENT(plat) .AND. PRESENT(plon)) THEN
270  !
271  IF (ug%G%CGRID=="IGN ".AND.iimax*ijmax/=il.AND.lwrite_coord) THEN
272  !
273  ALLOCATE(zxfull(ifull),zyfull(ifull))
274  ALLOCATE(plat(ifull),plon(ifull))
275  !
276  CALL get_gridtype_ign(ug%XGRID_FULL_PAR,klambert=ilambert,px=zxfull,py=zyfull)
277  CALL latlon_ign(ilambert,zxfull,zyfull,plat,plon)
278 
279  DEALLOCATE(zxfull, zyfull)
280  !
281  ELSEIF (ug%G%CGRID=="LONLATVAL ") THEN
282  !
283  ALLOCATE(plat(ifull),plon(ifull))
284  CALL get_gridtype_lonlatval(ug%XGRID_FULL_PAR,px=plon,py=plat)
285  !
286  ELSEIF (ug%G%CGRID=="GAUSS ") THEN
287  !
288  ALLOCATE(plat(ifull),plon(ifull))
289  CALL get_gridtype_gauss(ug%XGRID_FULL_PAR,plat=plat,plon=plon)
290  !
291  ELSE
292  !
293  ALLOCATE(plat(0),plon(0))
294  !
295  ENDIF
296  !
297 ENDIF
298 !
299 !
300 IF ( inpatch/=0 ) THEN
301  kdims(indims-1) = knpatch
302  hname_dim(indims-1) = 'Number_of_Patches'
303 ENDIF
304 !
305 IF ( insnlayer/=0 ) THEN
306  id = 1
307  IF (inpatch/=0) id = 2
308  kdims(indims-id) = insnlayer
309  hname_dim(indims-id) = 'snow_layer'
310 ENDIF
311 !
312 !
313 IF (hprogram/='NOTIME ') THEN
314  kdims(indims) = nf90_unlimited
315  hname_dim(indims) = 'time'
316 ELSE
317  kdims(indims) = 40
318  hname_dim(indims) = 'char_len'
319 ENDIF
320 !
321 IF (lhook) CALL dr_hook('OL_DEFINE_DIM',1,zhook_handle)
322 !
323 END SUBROUTINE ol_define_dim
subroutine get_gridtype_ign(PGRID_PAR, KLAMBERT, KL, PX, PY, PDX, PDY, KDIMX, KDIMY, PXALL, PYALL)
subroutine get_gridtype_lonlatval(PGRID_PAR, KL, PX, PY, PDX, PDY)
subroutine get_grid_dim(HGRID, KGRID_PAR, PGRID_PAR, ORECT, KDIM1, KDIM
Definition: get_grid_dim.F90:7
subroutine ol_define_dim(UG, KSIZE_FULL, HPROGRAM, KLUOUT, KNI, KDIM1, HUNIT1, HUNIT2, PX, PY, KDIMS, KDDIM, HNAME_DIM, KNPATCH, KNSNLAYER, PLAT, PLON)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine latlon_ign(KLAMBERT, PX, PY, PLAT, PLON)
subroutine get_gridtype_lonlat_reg(PGRID_PAR, PLONMIN, PLONMAX, PLATMIN, PLATMAX, KLON, KLAT, KL, PLON, PLAT)
subroutine get_grid_coord(HGRID_IN, KGRID_PAR_IN, PGRID_PAR_IN, K
subroutine get_gridtype_lonlat_rot(PGRID_PAR,
subroutine get_ign_maskall(UG, KNI, PX, PY, OTOT)
subroutine get_gridtype_conf_proj(PGRID_PAR, PLAT0, PLON0, PRPK, PBETA
logical lhook
Definition: yomhook.F90:15
subroutine get_gridtype_gauss(PGRID_PAR, KNLATI, PLAPO, PLOPO, PCODIL, KNLOPA, KL, PLAT, PLON, PLAT_XY, PLON_XY, PMESH_SIZE, PLONINF, PLATINF, PLONSUP, PLATSUP)
subroutine get_gridtype_cartesian(PGRID_PAR, PLAT0, PLON0,
integer, dimension(:), allocatable nmask_ign