SURFEX v8.1
General documentation of Surfex
rien.F90
Go to the documentation of this file.
1 SUBROUTINE rien(CDNAMC,KTYPTR,PSLAPO,PLOCEN,&
2  & PCODIL,KTRONC,KDGL,KNXLON,KNLOPA,KNOZPA,PSINLA,&
3  & KHTYP,KFLEV,PREF,PVALH,PVBH,KQUAD,&
4  & KDGSA,KDGEN,PEPS,LDFICP,KULOUT)
5 
6 !**** *RIEN* - Read Input ENvironment
7 
8 ! Purpose.
9 ! --------
10 ! It extracts geometry information from ARPEGE file.
11 
12 
13 !** Interface.
14 ! ----------
15 ! *CALL* *RIEN(CDNAMC,KTYPTR,PSLAPO,PLOCEN,
16 ! & PCODIL,KTRONC,KDGL,KNXLON,KNLOPA,KNOZPA,PSINLA,
17 ! & KHTYP,KFLEV,PREF,PVALH,PVBH,KQUAD,
18 ! & KDGSA,KDGEN,PEPS,LDFICP,KULOUT)
19 
20 ! Explicit arguments :
21 ! --------------------
22 
23 ! Input-Output:
24 ! ----------------------------
25 
26 ! CDNAMC ... Name of the cadre
27 
28 ! Determination of reference geometry:
29 
30 ! KTYPTR ... Type of Schmidt transform
31 ! 1 ===> Pole is at geog. North Pole
32 ! and stretching is equal to 1
33 ! 2 ===> General case
34 ! PSLAPO ... Sinus latitude of pole of dilatation
35 ! PLOCEN ... Longitude of pole of dilatation
36 ! PCODIL ... Stretching factor
37 ! KTRONC ... Truncation
38 ! KDGL ... Number of latitudes without poles
39 ! KNXLON ... Max. number of longitudes at a parallel
40 ! KNLOPA ... Number of longitudes at a parallel
41 ! KNOZPA ... Max. wave number at a parallel
42 ! KHTYP ... Type of collocation grid
43 ! 0 ==> regular grid
44 ! 2 ==> reduced grid towards the poles
45 ! KFLEV ... Number of vertical levels
46 ! PREF ... Reference pressure
47 ! PVALH ... "A" coefficients of vertical system
48 ! PVBH ... "B" coefficients of vertical system
49 ! KQUAD ... Quadrature ( 1 : Gauss ; 2 : Lobatto)
50 ! LDFICP ... .TRUE. if file contains the poles
51 ! -----------------------------------------------------------------
52 ! Input :
53 ! -------
54 
55 ! KDGSA ... First row of arrays KNLOPA and KNOZPA
56 ! KDGEN ... Last row of arrays KNLOPA and KNOZPA
57 ! PEPS ... Precision of the tests on real variables
58 ! KULOUT ... Output file unit
59 ! -----------------------------------------------------------------
60 
61 ! Output:
62 ! ----------------------------
63 
64 ! PSINLA ... Sinus of latitudes
65 
66 ! -----------------------------------------------------------------
67 
68 ! Implicit arguments :
69 ! --------------------
70 ! None.
71 
72 ! Method.
73 ! -------
74 ! See documentation
75 
76 ! Externals.
77 ! ----------
78 
79 ! Reference.
80 ! ----------
81 ! ARPEGE/ALADIN Documentation.
82 ! Document 'Control of coherence between namelist and Arpege File'
83 ! by R. El Khatib
84 
85 ! Original CHIEN Author
86 ! -------
87 ! Radmila Bubnova *GMAP/COMPAS - stage MICECO*
88 
89 
90 ! Modifications.
91 ! --------------
92 ! Original : 91-12-10
93 ! O. Marsden : May 2016 Extracted the KINF==1 case from CHIEN, to clean up GEOMETRY intents
94 ! ------------------------------------------------------------------
95 
96 USE parkind1 ,ONLY : jpim ,jprb
97 USE yomhook ,ONLY : lhook, dr_hook
98 
99 ! ------------------------------------------------------------------
100 
101 IMPLICIT NONE
102 
103 INTEGER(KIND=JPIM),INTENT(INOUT) :: KFLEV
104 INTEGER(KIND=JPIM),INTENT(IN) :: KDGSA
105 INTEGER(KIND=JPIM),INTENT(IN) :: KDGEN
106 CHARACTER(LEN=16) ,INTENT(IN) :: CDNAMC
107 INTEGER(KIND=JPIM),INTENT(INOUT) :: KTYPTR
108 REAL(KIND=JPRB) ,INTENT(INOUT) :: PSLAPO
109 REAL(KIND=JPRB) ,INTENT(INOUT) :: PLOCEN
110 REAL(KIND=JPRB) ,INTENT(INOUT) :: PCODIL
111 INTEGER(KIND=JPIM),INTENT(INOUT) :: KTRONC
112 INTEGER(KIND=JPIM),INTENT(INOUT) :: KDGL
113 INTEGER(KIND=JPIM),INTENT(INOUT) :: KNXLON
114 INTEGER(KIND=JPIM),INTENT(INOUT) :: KNLOPA(kdgsa:kdgen)
115 INTEGER(KIND=JPIM),INTENT(INOUT) :: KNOZPA(kdgsa:kdgen)
116 REAL(KIND=JPRB) ,INTENT(OUT) :: PSINLA(kdgsa:kdgen)
117 INTEGER(KIND=JPIM),INTENT(INOUT) :: KHTYP
118 REAL(KIND=JPRB) ,INTENT(INOUT) :: PREF
119 REAL(KIND=JPRB) ,INTENT(INOUT) :: PVALH(0:kflev)
120 REAL(KIND=JPRB) ,INTENT(INOUT) :: PVBH(0:kflev)
121 INTEGER(KIND=JPIM),INTENT(INOUT) :: KQUAD
122 REAL(KIND=JPRB) ,INTENT(IN) :: PEPS
123 LOGICAL ,INTENT(OUT) :: LDFICP
124 INTEGER(KIND=JPIM),INTENT(IN) :: KULOUT
125 
126 ! ------------------------------------------------------------------
127 
128 INTEGER(KIND=JPIM), ALLOCATABLE :: INLOPA(:),INOZPA(:)
129 REAL(KIND=JPRB), ALLOCATABLE :: ZVALH(:),ZVBH(:)
130 REAL(KIND=JPRB), ALLOCATABLE :: ZSINLA(:)
131 LOGICAL :: LLGARD
132 
133 INTEGER(KIND=JPIM) :: IDGL, IDGNH, IERR, IERRA, IHTYP, INIVER, INLATI, &
134  & INXLON, IQUADF, ISTROW, ITRONC, ITYPTR, JFLEV, JL, JLAT, JLEV, IMAXLEV, &
135  & IMAXGL, IMAXLON, IMAXTRUNC
136 
137 REAL(KIND=JPRB) :: ZCLOPO, ZCODIL, ZEPS, ZMUNPOL, ZREF, ZSLAPO, ZSLOPO, ZX1
138 REAL(KIND=JPRB) :: ZX2
139 REAL(KIND=JPRB) :: ZHOOK_HANDLE
140 
141 ! ------------------------------------------------------------------
142 
143 #include "abor1.intfb.h"
144 
145 ! ------------------------------------------------------------------
146 
147 IF (lhook) CALL dr_hook('RIEN',0,zhook_handle)
148 
149 ! ------------------------------------------------------------------
150 
151 !* 0. Get software limits
152 ! -------------------
153 
154 CALL falimu(imaxlev,imaxtrunc,imaxgl,imaxlon)
155 ALLOCATE(inlopa(imaxgl))
156 ALLOCATE(inozpa(imaxgl))
157 ALLOCATE(zsinla(imaxgl))
158 ALLOCATE(zvalh(0:imaxlev))
159 ALLOCATE(zvbh(0:imaxlev))
160 
161 !* 1. Read file characteristics
162 ! -------------------------
163 
164 WRITE(kulout,*) ' HAF, HAF : CADRE : ',cdnamc
165 CALL facies(cdnamc,ityptr,zslapo,zclopo,zslopo,zcodil,itronc,&
166  & inlati,inxlon,inlopa,inozpa,zsinla,iniver,zref,zvalh,zvbh,llgard)
167 
168 IF (inlati > kdgen-kdgsa+1) THEN
169  CALL abor1('RIEN : MAX. NUMBER OF LATITUDE ROWS IN MODEL TOO SMALL !')
170 ENDIF
171 IF (iniver > kflev) THEN
172  CALL abor1('RIEN : MAX. NUMBER OF LEVEL IN MODEL TOO SMALL !')
173 ENDIF
174 
175 !* 2. Preliminary tests
176 ! -----------------
177 
178 ! Test - type of file
179 
180 IF(ityptr < 0) THEN
181  WRITE(kulout,*) 'YOU ARE USING A FILE ALADIN ',&
182  & 'WHILE THE MODEL EXPECTS A FILE ARPEGE'
183  CALL abor1('RIEN: ABOR1 CALLED 2a')
184 ENDIF
185 
186 ! Test - type of collocation grid
187 
188 IF(inlopa(1) == inlopa(int(inlati/2))) THEN
189  ihtyp = 0
190  WRITE(kulout,*) 'FILE HAS REGULAR GRID '
191 ELSE
192  ihtyp = 2
193  WRITE(kulout,*) 'FILE HAS REDUCED GRID '
194 ENDIF
195 
196 ! Poles story
197 
198 zmunpol = 0.9999999999_jprb
199 IF(zsinla(1) >= zmunpol) THEN
200  WRITE(kulout,*) ' FILE CONTAINS THE POLES '
201  ldficp = .true.
202  idgl = inlati - 2
203  idgnh = (idgl+1)/2
204 ! The following test ensures that the fields of the file
205 ! will be read properly :
206  IF(inlopa(1) /= inlopa(2)) THEN
207  WRITE(kulout,*) ' FILE ROWS #1 AND #2 DO NOT HAVE THE ',&
208  & 'SAME NUMBER OF LONGITUDES'
209  WRITE(kulout,*) ' THIS MAKES THE MODEL UNABLE TO READ THE '&
210  & ,'FILE PROPERLY'
211  CALL abor1('RIEN: ABOR1 CALLED 2b')
212  ENDIF
213 ELSE
214  WRITE(kulout,*) ' FILE DOES NOT CONTAINS THE POLES '
215  ldficp = .false.
216  idgl = inlati
217  idgnh = (idgl+1)/2
218 ENDIF
219 
220 ! Test - Gaussian or Lobatto truncation
221 
222 IF(ldficp) THEN
223  zx1 = 1.0_jprb - zsinla(2)
224  zx2 = zsinla(2) - zsinla(3)
225  IF (zx1 > zx2) THEN
226  iquadf = 2
227  WRITE(kulout,*) 'FILE HAS LOBATTO QUADRATURE'
228  IF(mod(inlati,2) == 0) THEN
229  WRITE(kulout,*) ' WARNING ! INLATI IS EVEN !'
230  ENDIF
231  ELSE
232  iquadf = 1
233  WRITE(kulout,*) 'FILE HAS GAUSSIAN QUADRATURE'
234  IF(mod(inlati,2) == 1) THEN
235  WRITE(kulout,*) ' WARNING ! INLATI IS ODD !'
236  ENDIF
237  ENDIF
238 ELSE
239  iquadf = 1
240  WRITE(kulout,*) 'FILE HAS GAUSSIAN QUADRATURE'
241  IF(mod(inlati,2) == 1) THEN
242  WRITE(kulout,*) ' WARNING ! INLATI IS ODD !'
243  ENDIF
244 ENDIF
245 
246 
247 
248 !* 4. Read information from file (extracted from CHIEN)
249 
250 !* 4.1 Pole of dilatation, stretching, truncation, coef. A, B
251 
252  khtyp = ihtyp
253  kquad = iquadf
254  ktyptr = ityptr
255  pcodil = zcodil
256  pslapo = zslapo
257  plocen = sign(1.0_jprb,zslopo)*acos(zclopo)
258  ktronc = itronc
259  kflev = iniver
260  pref = zref
261  DO jlev = 0,kflev
262  pvalh(jlev) = zvalh(jlev)
263  pvbh(jlev) = zvbh(jlev)
264  ENDDO
265 
266 !* 4.2 Latitudes and longitudes.
267 
268  knxlon = inxlon
269  IF(ldficp) THEN
270  kdgl = idgl
271  DO jl= 0, idgnh
272  psinla(jl) = zsinla(jl+1)
273  knlopa(jl) = inlopa(jl+1)
274  knozpa(jl) = inozpa(jl+1)
275  ENDDO
276  DO jl=0, idgnh
277  psinla(kdgl+1 - jl) = - zsinla(jl+1)
278  knlopa(kdgl+1 - jl) = inlopa(jl+1)
279  knozpa(kdgl+1 - jl) = inozpa(jl+1)
280  ENDDO
281  ELSE
282  kdgl = idgl
283  DO jl= 1, idgnh
284  psinla(jl) = zsinla(jl)
285  knlopa(jl) = inlopa(jl)
286  knozpa(jl) = inozpa(jl)
287  ENDDO
288  DO jl=1, idgnh
289  psinla(kdgl - jl + 1) = - zsinla(jl)
290  knlopa(kdgl - jl + 1) = inlopa(jl)
291  knozpa(kdgl - jl + 1) = inozpa(jl)
292  ENDDO
293  IF (kdgsa < 1) THEN
294  psinla(0) = 1.0_jprb
295  knlopa(0) = inlopa(1)
296  knozpa(0) = inozpa(1)
297  ENDIF
298  IF (kdgen > kdgl) THEN
299  psinla(kdgl+1) = - 1.0_jprb
300  knlopa(kdgl+1) = inlopa(1)
301  knozpa(kdgl+1) = inozpa(1)
302  ENDIF
303  ENDIF
304 
305 
306 
307 DEALLOCATE(inlopa)
308 DEALLOCATE(inozpa)
309 DEALLOCATE(zsinla)
310 DEALLOCATE(zvalh)
311 DEALLOCATE(zvbh)
312 
313 ! ------------------------------------------------------------------
314 
315 IF (lhook) CALL dr_hook('RIEN',1,zhook_handle)
316 END SUBROUTINE rien
317 
integer, parameter jpim
Definition: parkind1.F90:13
subroutine rien(CDNAMC, KTYPTR, PSLAPO, PLOCEN, PCODIL, KTRONC, KDGL, KNXLON, KNLOPA, KNOZPA, PSINLA, KHTYP, KFLEV, PREF, PVALH, PVBH, KQUAD, KDGSA, KDGEN, PEPS, LDFICP, KULOUT)
Definition: rien.F90:5
subroutine abor1(CDTEXT)
Definition: abor1.F90:2
subroutine falimu(KXNIVV, KXTRON, KXLATI, KXLONG)
Definition: falimu.F90:115
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine facies(CDNOMC, KTYPTR, PSLAPO, PCLOPO, PSLOPO, PCODIL, KTRONC, KNLATI, KNXLON, KNLOPA, KNOZPA, PSINLA, KNIVER, PREFER, PAHYBR, PBHYBR, LDGARD)
Definition: facies.F90:276