SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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, U, &
6  hprogram, kluout, kni, kdim1, hunit1, hunit2, &
7  px, py, kdims, kddim, hname_dim, knpatch)
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 !-------------------------------------------------------------------------------
38 !
39 !
40 !
42 USE modd_surf_atm_n, ONLY : surf_atm_t
43 !
44 USE modd_io_surf_ol, ONLY: nmask_ign
45 !
46 USE modn_io_offline, ONLY : lwrite_coord
47 !
48 USE modi_get_grid_dim
49 USE modi_get_grid_coord
50 !
52 !
53 USE yomhook ,ONLY : lhook, dr_hook
54 USE parkind1 ,ONLY : jprb
55 !
56 IMPLICIT NONE
57 include 'netcdf.inc'
58 !
59 !
60 TYPE(surf_atm_grid_t), INTENT(INOUT) :: ug
61 TYPE(surf_atm_t), INTENT(INOUT) :: u
62 !
63  CHARACTER(LEN=6), INTENT(IN) :: hprogram
64 INTEGER, INTENT(IN) :: kluout
65 INTEGER, INTENT(IN) :: kni
66 INTEGER, INTENT(OUT) :: kdim1
67  CHARACTER(LEN=13) , DIMENSION(:), INTENT(OUT) :: hunit1, hunit2
68 REAL,DIMENSION(:), POINTER :: px, py
69 INTEGER, DIMENSION(:), POINTER :: kdims, kddim
70  CHARACTER(LEN=100), DIMENSION(:), POINTER :: hname_dim
71 INTEGER, OPTIONAL, INTENT(IN) :: knpatch
72 !
73 REAL, DIMENSION(KNI) :: zxx, zyy
74  CHARACTER(LEN=3) :: ytype
75 INTEGER :: indims, idim2
76 INTEGER :: i, j, k, l
77 LOGICAL :: grect ! T if rectangular grid
78 REAL(KIND=JPRB) :: zhook_handle
79 !
80 IF (lhook) CALL dr_hook('OL_DEFINE_DIM',0,zhook_handle)
81 !
82 kdim1=0
83 idim2=0
84 !
85 IF (.NOT.lwrite_coord) THEN
86  !
87  IF ( ug%CGRID.EQ.'CONF PROJ ' .OR. ug%CGRID.EQ.'CARTESIAN '&
88  .OR. ug%CGRID.EQ.'LONLAT REG' .OR. ug%CGRID.EQ.'IGN' ) THEN
89  ytype='XY '
90  IF (ug%CGRID.EQ.'LONLAT REG') ytype='LON'
91  IF (ASSOCIATED(ug%XGRID_FULL_PAR)) THEN
92  CALL get_grid_dim(ug%CGRID,ug%NGRID_PAR,ug%XGRID_FULL_PAR,grect,kdim1,idim2)
93  ELSEIF (ASSOCIATED(ug%XGRID_PAR)) THEN
94  CALL get_grid_dim(ug%CGRID,ug%NGRID_PAR,ug%XGRID_PAR,grect,kdim1,idim2)
95  ENDIF
96  ENDIF
97  !
98 ENDIF
99 !
100 indims = 2
101 IF ( kdim1.NE.0 ) indims = 3
102 IF ( present(knpatch) ) indims = indims + 1
103 !
104 ALLOCATE(kdims(indims))
105 ALLOCATE(kddim(indims))
106 ALLOCATE(hname_dim(indims))
107 !
108 IF ( kdim1.NE.0 ) THEN
109  kdims(1) = kdim1
110  kdims(2) = idim2
111  IF (ytype.EQ.'LON') THEN
112  hname_dim(1) = 'lon'
113  hname_dim(2) = 'lat'
114  hunit1(1) = 'degrees_east'
115  hunit2(1) = 'degrees_north'
116  ELSE
117  hname_dim(1) = 'xx'
118  hname_dim(2) = 'yy'
119  hunit1(1) = 'meters'
120  hunit2(1) = 'meters'
121  ENDIF
122  ALLOCATE(px(kdim1))
123  ALLOCATE(py(idim2))
124 ELSE
125  kdims(1) = kni
126  hname_dim(1) = 'Number_of_points'
127  IF (lwrite_coord) THEN
128  ALLOCATE(px(kni))
129  ALLOCATE(py(kni))
130  ENDIF
131 ENDIF
132 !
133 IF (lwrite_coord) THEN
134  !
135  IF (ASSOCIATED(ug%XGRID_FULL_PAR)) THEN
136  CALL get_grid_coord(ug, u, &
137  kluout,px=px,py=py,kl=kni,hgrid=ug%CGRID,pgrid_par=ug%XGRID_FULL_PAR)
138  ELSEIF (ASSOCIATED(ug%XGRID_PAR)) THEN
139  CALL get_grid_coord(ug, u, &
140  kluout,px=px,py=py,kl=kni,hgrid=ug%CGRID,pgrid_par=ug%XGRID_PAR)
141  ENDIF
142  !
143 ELSEIF ( ug%CGRID.EQ.'CONF PROJ '.OR. ug%CGRID.EQ.'CARTESIAN '.OR. &
144  ug%CGRID.EQ.'LONLAT REG' ) THEN
145  !
146  IF (ASSOCIATED(ug%XGRID_FULL_PAR)) THEN
147  CALL get_grid_coord(ug, u, &
148  kluout,px=zxx,py=zyy,kl=kni,hgrid=ug%CGRID,pgrid_par=ug%XGRID_FULL_PAR)
149  ELSEIF (ASSOCIATED(ug%XGRID_PAR)) THEN
150  CALL get_grid_coord(ug, u, &
151  kluout,px=zxx,py=zyy,kl=kni,hgrid=ug%CGRID,pgrid_par=ug%XGRID_PAR)
152  ENDIF
153  !
154  IF (ASSOCIATED(px)) THEN
155  DO j=1,SIZE(px)
156  px(j)=zxx(j)
157  ENDDO
158  ENDIF
159  IF (ASSOCIATED(py)) THEN
160  DO j=1,SIZE(py)
161  py(j)=zyy((j-1)*(kni/SIZE(py))+1)
162  ENDDO
163  ENDIF
164 !
165 ELSEIF(ug%CGRID.EQ.'IGN ')THEN
166  !
167  IF (ASSOCIATED(ug%XGRID_FULL_PAR)) THEN
168  CALL get_gridtype_ign(ug%XGRID_FULL_PAR,px=zxx,py=zyy,pxall=px,pyall=py)
169  ELSEIF (ASSOCIATED(ug%XGRID_PAR)) THEN
170  CALL get_gridtype_ign(ug%XGRID_PAR,px=zxx,py=zyy,pxall=px,pyall=py)
171  ENDIF
172  !
173  IF (.NOT.ALLOCATED(nmask_ign))THEN
174  ALLOCATE(nmask_ign(kni))
175  l=0
176  DO j=1,SIZE(py)
177  DO i=1,SIZE(px)
178  l=l+1
179  DO k=1,kni
180  IF((zxx(k)==px(i)).AND.(zyy(k)==py(j)))THEN
181  nmask_ign(k)=l
182  ENDIF
183  ENDDO
184  ENDDO
185  ENDDO
186  ENDIF
187  !
188 ENDIF
189 !
190 !
191 IF (present(knpatch)) THEN
192  kdims(indims-1) = knpatch
193  hname_dim(indims-1) = 'Number_of_Tile'
194 ENDIF
195 !
196 IF (hprogram/='NOTIME ') THEN
197  kdims(indims) = nf_unlimited
198  hname_dim(indims) = 'time'
199 ELSE
200  kdims(indims) = 40
201  hname_dim(indims) = 'char_len'
202 ENDIF
203 !
204 IF (lhook) CALL dr_hook('OL_DEFINE_DIM',1,zhook_handle)
205 !
206 END SUBROUTINE ol_define_dim
subroutine get_grid_dim(HGRID, KGRID_PAR, PGRID_PAR, ORECT, KDIM1, KDIM2)
Definition: get_grid_dim.F90:6
subroutine get_grid_coord(UG, U, KLUOUT, PX, PY, KL, HGRID, PGRID_PAR)
subroutine ol_define_dim(UG, U, HPROGRAM, KLUOUT, KNI, KDIM1, HUNIT1, HUNIT2, PX, PY, KDIMS, KDDIM, HNAME_DIM, KNPATCH)
subroutine get_gridtype_ign(PGRID_PAR, KLAMBERT, KL, PX, PY, PDX, PDY, KDIMX, KDIMY, PXALL, PYALL)