Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
! #########
SUBROUTINE PGD_GRID(HPROGRAM,HFILE,HFILETYPE,OGRID,HGRID,KGRID_PAR,PGRID_PAR)
! ##########################################################
!!
!! PURPOSE
!! -------
!! Reads in namelist the grid type and parameters.
!!
!! METHOD
!! ------
!!
!! EXTERNAL
!! --------
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!!
!!
!! REFERENCE
!! ---------
!!
!! AUTHOR
!! ------
!!
!! V. Masson Meteo-France
!!
!! MODIFICATION
!! ------------
!!
!! Original 01/2004
!! E. Martin 10/2007 IGN grid
!----------------------------------------------------------------------------
!
!* 0. DECLARATION
! -----------
!
USE MODD_SURFEX_MPI, ONLY : NSIZE, NINDEX, NPIO, NRANK
USE MODD_SURFEX_OMP, ONLY : NINDX2, NWORK, XWORK, XWORK2, XWORK3, &
NWORK_FULL, XWORK_FULL, XWORK2_FULL
!
USE MODD_PGD_GRID, ONLY : NL, XGRID_PAR, NGRID_PAR, XMESHLENGTH
USE MODN_PGD_GRID
USE MODD_SURF_ATM_GRID_n, ONLY : XLAT, XLON, XMESH_SIZE, XJPDIR
USE MODD_SURF_ATM_n, ONLY : NDIM_FULL
USE MODD_CSTS, ONLY : XPI, XRADIUS
!
USE MODI_DEFAULT_GRID
USE MODI_GRID_FROM_FILE
USE MODI_OPEN_NAMELIST
USE MODI_TEST_NAM_VAR_SURF
USE MODI_CLOSE_NAMELIST
USE MODI_GET_LUOUT
USE MODI_READ_NAM_GRIDTYPE
USE MODI_LATLON_GRID
!
USE MODE_POS_SURF
!
!
USE YOMHOOK ,ONLY : LHOOK, DR_HOOK
USE PARKIND1 ,ONLY : JPRB
!
USE MODI_ABOR1_SFX
!
IMPLICIT NONE
!
!* 0.1 Declaration of dummy arguments
! ------------------------------
!
CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling the surface
CHARACTER(LEN=28), INTENT(IN) :: HFILE ! atmospheric file name
CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! atmospheric file type
LOGICAL, INTENT(IN) :: OGRID ! .true. if grid is imposed by atm. model
CHARACTER(LEN=10), INTENT(OUT) :: HGRID ! grid type
INTEGER, INTENT(OUT) :: KGRID_PAR ! size of PGRID_PAR
REAL, DIMENSION(:), POINTER :: PGRID_PAR ! parameters defining this grid
!
!
!* 0.2 Declaration of local variables
! ------------------------------
!
INTEGER :: ILUOUT ! output listing logical unit
INTEGER :: ILUNAM ! namelist file logical unit
LOGICAL :: GFOUND ! Flag true if namelist is present
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!
!* 0.3 Declaration of namelists
! ------------------------
!
!------------------------------------------------------------------------------
!
!* 1. Defaults
! --------
!
IF (LHOOK) CALL DR_HOOK('PGD_GRID',0,ZHOOK_HANDLE)
CALL DEFAULT_GRID(HPROGRAM,CGRID)
!
YINIFILE = ' '
YFILETYPE = ' '
!
IF (OGRID) THEN
YINIFILE = HFILE
YFILETYPE = HFILETYPE
END IF
!
CALL GET_LUOUT(HPROGRAM,ILUOUT)
!------------------------------------------------------------------------------
!
!* 2. Open namelist
! -------------
!
IF (.NOT. OGRID) THEN
CALL OPEN_NAMELIST(HPROGRAM,ILUNAM)
!
!------------------------------------------------------------------------------
!
!* 3. Read grid type
! --------------
!
CALL POSNAM(ILUNAM,'NAM_PGD_GRID',GFOUND,ILUOUT)
IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PGD_GRID)
!
!------------------------------------------------------------------------------
!
!* 5. Close namelist
! --------------
!
CALL CLOSE_NAMELIST(HPROGRAM,ILUNAM)
!
END IF
!-------------------------------------------------------------------------------
!
!* 4. check of grid and input file types
! ----------------------------------
!
CALL TEST_NAM_VAR_SURF(ILUOUT,'CGRID',CGRID,'CONF PROJ ','NONE ','LONLAT REG','CARTESIAN ','GAUSS ',&
'IGN ','LONLATVAL ')
CALL TEST_NAM_VAR_SURF(ILUOUT,'YFILETYPE',YFILETYPE,' ','MESONH','LFI ','ASCII ')
!
!
!------------------------------------------------------------------------------
!
!* 5. Initializes grid characteristics
! --------------------------------
!
!* 5.1 From another file
! -----------------
!
IF (LEN_TRIM(YFILETYPE)>0 .AND. LEN_TRIM(YINIFILE)>0 ) THEN
IF (YFILETYPE=='MESONH' .OR. YFILETYPE=='LFI ' .OR. YFILETYPE=='ASCII ') THEN
CALL GRID_FROM_FILE(HPROGRAM,YINIFILE,YFILETYPE,OGRID,CGRID,NGRID_PAR,XGRID_PAR,NL)
ELSE
CALL ABOR1_SFX('PGD_GRID: FILE TYPE NOT SUPPORTED '//HFILETYPE//' FOR FILE '//HFILE)
END IF
!
ELSE
!
!* 5.2 Grid not initialized
! --------------------
!
IF (CGRID=='NONE ' .OR. CGRID==' ') THEN
CALL ABOR1_SFX('PGD_GRID: GRID TYPE NOT INITIALIZED, CGRID='//CGRID)
!
!* 5.3 Grid initialized
! ----------------
!
ELSE
!
CALL READ_NAM_GRIDTYPE(HPROGRAM,CGRID,NGRID_PAR,XGRID_PAR,NL)
!
END IF
END IF
!
HGRID = CGRID
NDIM_FULL = NL
NSIZE = NDIM_FULL
IF (.NOT.ALLOCATED(NINDEX)) THEN
ALLOCATE(NINDEX(NDIM_FULL))
NINDEX(:) = 0
ENDIF
NINDX2 = NDIM_FULL
ALLOCATE(NWORK(NDIM_FULL))
ALLOCATE(XWORK(NDIM_FULL))
ALLOCATE(XWORK2(NDIM_FULL,10))
ALLOCATE(XWORK3(NDIM_FULL,10,10))
IF (NRANK==NPIO) THEN
ALLOCATE(NWORK_FULL(NDIM_FULL))
ALLOCATE(XWORK_FULL(NDIM_FULL))
ALLOCATE(XWORK2_FULL(NDIM_FULL,10))
ELSE
ALLOCATE(NWORK_FULL(0))
ALLOCATE(XWORK_FULL(0))
ALLOCATE(XWORK2_FULL(0,0))
ENDIF
!
KGRID_PAR = NGRID_PAR
ALLOCATE(PGRID_PAR(KGRID_PAR))
PGRID_PAR = XGRID_PAR
!
!------------------------------------------------------------------------------
!
!* 6. Latitude and longitude
! ----------------------
!
ALLOCATE(XLAT (NL))
ALLOCATE(XLON (NL))
ALLOCATE(XMESH_SIZE (NL))
ALLOCATE(XJPDIR (NL))
CALL LATLON_GRID(CGRID,NGRID_PAR,NL,ILUOUT,XGRID_PAR,XLAT,XLON,XMESH_SIZE,XJPDIR)
!
!------------------------------------------------------------------------------
!
!* 7. Average grid length (in degrees)
! --------------------------------
!
!* in meters
XMESHLENGTH = SUM ( SQRT(XMESH_SIZE) ) / NL
!
!* in degrees (of latitude)
XMESHLENGTH = XMESHLENGTH *180. / XPI / XRADIUS
IF (LHOOK) CALL DR_HOOK('PGD_GRID',1,ZHOOK_HANDLE)
!
!-------------------------------------------------------------------------------
!
END SUBROUTINE PGD_GRID