SURFEX v8.1
General documentation of Surfex
farine.F90
Go to the documentation of this file.
1 ! Oct-2012 P. Marguinaud 64b LFI
2 ! Jan-2011 P. Marguinaud Thread-safe FA
3 SUBROUTINE farine_fort &
4 & (fa, koptio )
5 USE fa_mod, ONLY : fa_com, jpniil
6 USE parkind1, ONLY : jprb
7 USE yomhook , ONLY : lhook, dr_hook
9 IMPLICIT NONE
10 !****
11 ! Ce sous-programme est charge des INITIALISATIONS du logiciel
12 ! de Fichiers ARPEGE FA ( Routine d'INitialisation )
13 !**
14 ! Argument : KOPTIO ==> OPTION concernant le mode d'utilisation.
15 ! (Entree) (MULTI-TACHE ou NON)
16 ! VALEURS POSSIBLES : 0 ==> Mode MONO-Tache prescrit;
17 ! 1 ==> Mode MULTI-Taches prescrit;
18 ! 2 ==> Utilisation du mode par defaut si c'est
19 ! le premier appel; sinon on garde le mode
20 ! prescrit anterieurement .
21 !
22 !
23 !
24 TYPE(fa_com) :: FA
25 INTEGER (KIND=JPLIKB) KOPTIO
26 !
27 INTEGER (KIND=JPLIKB) IREP, J
28 INTEGER (KIND=JPLIKB) INIMES, INUMER
29 !
30 LOGICAL LLNMUL, LLASGN, LLREL
31 !
32 !
33 CHARACTER(LEN=FA%JPXNOM) CLACTI
34 CHARACTER(LEN=FA%JPLMES) CLMESS
35 CHARACTER(LEN=FA%JPLSPX) CLNSPR
36 LOGICAL LLFATA
37 
38 !
39 REAL(KIND=JPRB) :: ZHOOK_HANDLE
40 IF (lhook) CALL dr_hook('FARINE_MT',0,zhook_handle)
41 clacti=''
42 IF (koptio.LT.0.OR.koptio.GT.2) THEN
43  irep=-52
44  GOTO 1001
45 ENDIF
46 !
47 IF (fa%FARINE_LLPREA) THEN
48 !
49 ! C'EST LE PREMIER APPEL AU sous-programme - INITIALISATIONS .
50 !
51  fa%NFIOUV=0
52  fa%NCADEF=0
53  fa%NRFAGA=1
54  fa%NIMSGA=1
55  fa%NBIPDG=24
56  fa%NBICSP=24
57  fa%NPUILA=1
58  fa%NSTROI=10
59  fa%NMIDPL=5
60  fa%NIGRIB=2
61  fa%LFAMOP=.false.
62  fa%FICHIER(0)%LERRFA=.true.
63  fa%FICHIER(0)%NIVOMS=0
64  fa%NCPCAD=len(fa%CADRE(1)%CNOMCA)
65  fa%SPSMIN=60000._jpdblr
66  fa%SPSMAX=110000._jpdblr
67  fa%MPRESX=100000
68  fa%NBIMAC=64
69  fa%NBIMAX=31
70  fa%LIGARD=.false.
71  fa%NTYPTX=2
72  fa%NXNIVV=fa%JPXNIV
73  fa%NXTRON=fa%JPXTRO
74  fa%NXLATI=fa%JPXLAT
75  fa%NXLONG=fa%JPXLON
76 !
77  DO j=1,fa%JPNXFA
78  fa%FICHIER(j)%NULOGI=jpniil
79  fa%FICHIER(j)%NRASHO=0
80  fa%FICHIER(j)%NRASVE=0
81  ENDDO
82 !
83  DO j=1,fa%JPNXCA
84  fa%CADRE(j)%CNOMCA=' '
85  ENDDO
86 !
87  DO j=1,fa%JPXNOM
88  fa%CHAINC(j:j)='?'
89  ENDDO
90 !
91 ! Descripteurs lies aux types de niveaux verticaux:
92 ! prefixes reconnus, extrema possibles du niveau dans le cas
93 ! d'une coordonnee verticale, premiers elements de xB1PAR.
94 !
95  DO j=0,fa%JPTNIV
96 !
97 ! Initialisation par defaut pour la serie d'affectations qui suit.
98 !
99  fa%NIVDSC(0,j)=0
100  fa%NIVDSC(1,j)=0
101  fa%NIVDSC(2,j)=0
102 !
103 ! Tous les cas sont reputes "niveau vrai" (pas des couches).
104 !
105  fa%NIVDSC(4,j)=0
106  ENDDO
107 !
108 ! Cas du type non reconnu.
109 !
110  fa%NIVDSC(0,0)=0
111  fa%NIVDSC(3,0)=200
112 !
113 ! Niveau hybride.
114 !
115  fa%CTNPRF(1)='S'
116  fa%NIVDSC(0,1)=3
117  fa%NIVDSC(2,1)=fa%JPXNIV
118  fa%NIVDSC(3,1)=109
119 !
120 ! Niveau isobare.
121 !
122  fa%CTNPRF(2)='P'
123  fa%NIVDSC(0,2)=5
124  fa%NIVDSC(1,2)=1
125  fa%NIVDSC(2,2)=10**5
126  fa%NIVDSC(3,2)=100
127 !
128 ! Niveau iso-hauteur (au-dessus d'un relief de reference).
129 !
130  fa%CTNPRF(3)='H'
131  fa%NIVDSC(0,3)=5
132  fa%NIVDSC(2,3)=10**5-1
133  fa%NIVDSC(3,3)=105
134 !
135 ! Niveau iso-tourbillon_potentiel.
136 !
137  fa%CTNPRF(4)='V'
138  fa%NIVDSC(0,4)=3
139  fa%NIVDSC(2,4)=10**3-1
140  fa%NIVDSC(3,4)=117
141 !
142 ! Niveau iso-temperature_potentielle.
143 !
144  fa%CTNPRF(5)='T'
145  fa%NIVDSC(0,5)=3
146  fa%NIVDSC(2,5)=10**3-1
147  fa%NIVDSC(3,5)=113
148 !
149 ! Niveau surface.
150 !
151  fa%CTNPRF(6)='SURF'
152  fa%NIVDSC(3,6)=1
153 !
154 ! Niveau de vent max (jet).
155 !
156  fa%CTNPRF(7)='JET'
157  fa%NIVDSC(3,7)=6
158 !
159 ! Niveau surface.
160 !
161  fa%CTNPRF(8)='TROPO'
162  fa%NIVDSC(3,8)=7
163 !
164 ! Niveau moyen de la mer.
165 !
166  fa%CTNPRF(9)='MER'
167  fa%NIVDSC(3,9)=102
168 !
169 ! Niveau hybride bis pour MOCAGE
170 !
171  fa%CTNPRF(10)='L'
172  fa%NIVDSC(0,10)=3
173  fa%NIVDSC(2,10)=fa%JPXNIV
174 !
175 ! Niveau iso-temperature.
176 !
177  fa%CTNPRF(11)='KB'
178  fa%NIVDSC(0,11)=3
179  fa%NIVDSC(2,11)=10**3-1
180  fa%NIVDSC(3,11)=113
181 !
182  fa%CTNPRF(12)='KT'
183  fa%NIVDSC(0,12)=3
184  fa%NIVDSC(2,12)=10**3-1
185  fa%NIVDSC(3,12)=113
186 !
187 ! Niveau iso-hauteur (au-dessus du niveau moyen de la mer).
188 !
189  fa%CTNPRF(13)='F'
190  fa%NIVDSC(0,13)=4
191  fa%NIVDSC(2,13)=10**4-1
192  fa%NIVDSC(3,13)=103
193 !
194 ! Niveau SURFEX
195 !
196  fa%CTNPRF(14)='X'
197  fa%NIVDSC(0,14)=3
198  fa%NIVDSC(2,14)=10**3-1
199  fa%NIVDSC(3,14)=113
200 
201 !
202 ! Initialisations pour la mise en oeuvre de GRIBEX
203 !
204 ! 1/ On force GRIBEX a calculer la puissance de laplacien
205 ! CALL GRSMKP(1)
206 ! 2/ On retire l'arrondi du message GRIB a un multiple de 120 octets
207 ! CALL GRSRND(0)
208 !
209 ! 3/ Creation de la correspondance "nom article FA" et
210 ! "descripteurs GRIBEX"
211  IF (.NOT. ASSOCIATED (fa%YGR1TAB)) THEN
212  CALL faicor_fort (fa)
213  ENDIF
214 !
215 !
216 ! 4/ Definition du codage GRIBEX par defaut:
217 !
218 ! Il s'agit d'une compression "APAC1" (meilleure solution entre
219 ! l'absence de compression et la compression ligne a ligne)
220 ! associee a la compression "general extended", a la differentiation
221 ! spatiale (-1: calcul dynamique de l'ordre) et au rearrangement
222 ! boustrophedonique.
223 !
224 ! "APAC1"
225  fa%NCODGRI(1) = 1
226  fa%NCODGRI(2) = 16
227  fa%NCODGRI(3) = 0
228  fa%NCODGRI(4) = 0
229  fa%NCODGRI(5) = 16
230  fa%NCODGRI(6) = 0
231 ! compression "general extended"
232  fa%NCODGRI(7) = 8
233 ! arrangement boustrophedonique
234  fa%NCODGRI(8) = 4
235 ! differentiation spatiale
236  fa%NCODGRI( 9)= 0
237  fa%NCODGRI(10)= -1
238 ! Calcul automatique du facteur d'echelle decimal (KSEC1 (23))
239  fa%NCODGRI(11)= 1
240 ! Ecriture des champs GRIB1 dans un fichier externe
241  fa%NCODGRI(12)= 0
242 !
243 ! 5/ Initialisation de logiques pilotant des initialisations ulterieures
244 !
245 ! Il faudra initialiser XLAPxDx
246  fa%LIXLAP=.true.
247 ! Il ne faut pas initialiser FLAP1Dx(): on attend l'ouverture du fichier
248  fa%FICHIER(:)%LIFLAP=.false.
249 ! Il faudra initialiser le tableau FA%NSEC1 (section 1 GRIBEX) via FAISC1
250  fa%FICHIER(:)%LISEC1=.true.
251 ! Il faudra initialiser les tableaux NSEC2xxx et FA%XSEC2
252 ! (section 2 GRIBEX) via FAISC2
253  fa%CADRE(:)%LISEC2=.true.
254 ! Il faudra initialiser le tableau FA%NSC2ALF
255 ! (section 2 GRIBEX) via FAIS2F
256  fa%FICHIER(:)%LISC2F=.true.
257 !
258  fa%FARINE_LLPREA=.false.
259  llnmul=(koptio.EQ.1).OR.(koptio.EQ.2.AND.fa%FARINE_LLDEFM)
260  llasgn=llnmul
261  llrel=.false.
262  CALL lfiini_fort &
263 & (fa%LFI, koptio)
264 !
265 ELSEIF (koptio.EQ.2) THEN
266 !
267 ! CE N'EST PAS LE PREMIER APPEL, MAIS COMME L'ARGUMENT VAUT 2,
268 ! ON LAISSE LES CHOSES EN PLACE .
269 !
270  llnmul=fa%LFAMUL
271  llasgn=.false.
272  llrel =.false.
273 !
274 ELSE
275  llnmul=koptio.EQ.1
276  llasgn=llnmul.AND.(.NOT.fa%LFAMUL)
277  llrel =(.NOT.llnmul).AND.fa%LFAMUL
278 !
279 ! CE N'EST PAS LE PREMIER APPEL ET LE MODE EST PASSE 'EXPLICITEMENT'
280 !
281  IF ((llasgn.OR.llrel).AND.fa%NFIOUV.NE.0) THEN
282  irep=-54
283  GOTO 1001
284  ENDIF
285 !
286  CALL lfiini_fort &
287 & (fa%LFI, koptio)
288 !
289 ENDIF
290 !
291 fa%LFAMUL=llnmul
292 irep=0
293 !
294 IF (llasgn) THEN
295  CALL lfiver_fort &
296 & (fa%LFI, fa%VRGLAS,'ASGN')
297 ELSEIF (llrel) THEN
298  CALL lfiver_fort &
299 & (fa%LFI, fa%VRGLAS,'REL')
300 ENDIF
301 !
302 1001 CONTINUE
303 !
304 ! MESSAGERIE EVENTUELLE, AVEC ABORT SI NECESSAIRE .
305 !
306 llfata=irep.NE.0.AND.fa%NRFAGA.NE.2
307 !
308 IF (llfata.OR.fa%LFAMOP) THEN
309  inimes=2
310 ELSEIF (irep.NE.0) THEN
311  inimes=0
312 ELSEIF (fa%NIMSGA.EQ.2) THEN
313  inimes=2
314 ELSE
315  IF (lhook) CALL dr_hook('FARINE_MT',1,zhook_handle)
316  RETURN
317 ENDIF
318 !
319 clnspr='FARINE'
320 inumer=jpniil
321 !
322 IF (max(inimes,fa%NIMSGA).EQ.2) THEN
323  WRITE (unit=clmess, &
324 & fmt='(''KOPTIO='',I5,'', CODE INTERNE='',I4)' &
325 & ) koptio,irep
326  IF (inimes.NE.2) CALL faipar_fort &
327 & (fa, inumer,fa%NIMSGA,irep, &
328 & .false.,clmess, &
329 & clnspr,clacti,.false.)
330 ENDIF
331 !
332 CALL faipar_fort &
333 & (fa, inumer,inimes,irep,llfata,clmess, &
334 & clnspr,clacti,.false.)
335 !
336 IF (lhook) CALL dr_hook('FARINE_MT',1,zhook_handle)
337 END SUBROUTINE farine_fort
338 
339 
340 
341 ! Oct-2012 P. Marguinaud 64b LFI
342 SUBROUTINE farine64 &
343 & (koptio)
344 USE fa_mod, ONLY : fa => fa_com_default, &
347 USE lfi_precision
348 IMPLICIT NONE
349 ! Arguments
350 INTEGER (KIND=JPLIKB) KOPTIO ! IN
351 
352 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
353 
354 CALL farine_fort &
355 & (fa, koptio)
356 
357 END SUBROUTINE farine64
358 
359 SUBROUTINE farine &
360 & (koptio)
361 USE fa_mod, ONLY : fa => fa_com_default, &
364 USE lfi_precision
365 IMPLICIT NONE
366 ! Arguments
367 INTEGER (KIND=JPLIKM) KOPTIO ! IN
368 
369 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
370 
371 CALL farine_mt &
372 & (fa, koptio)
373 
374 END SUBROUTINE farine
375 
376 SUBROUTINE farine_mt &
377 & (fa, koptio)
378 USE fa_mod, ONLY : fa_com
379 USE lfi_precision
380 IMPLICIT NONE
381 ! Arguments
382 type(fa_com) fa ! INOUT
383 INTEGER (KIND=JPLIKM) KOPTIO ! IN
384 ! Local integers
385 INTEGER (KIND=JPLIKB) IOPTIO ! IN
386 ! Convert arguments
387 
388 ioptio = int( koptio, jplikb)
389 
390 CALL farine_fort &
391 & (fa, ioptio)
392 
393 
394 END SUBROUTINE farine_mt
395 
396 !INTF KOPTIO IN
integer, parameter jplikb
logical, save fa_com_default_init
Definition: fa_mod.F90:477
subroutine new_fa_default()
Definition: fa_mod.F90:649
Definition: fa_mod.F90:1
subroutine faicor_fort(FA)
Definition: faicor.F90:5
subroutine lfiver_fort(LFI, PVEROU, CDSENS)
Definition: lfiver.F90:6
integer, parameter jprb
Definition: parkind1.F90:32
subroutine lfiini_fort(LFI, KOPTIO)
Definition: lfiini.F90:6
subroutine farine_fort(FA, KOPTIO)
Definition: farine.F90:5
subroutine farine_mt(FA, KOPTIO)
Definition: farine.F90:378
logical lhook
Definition: yomhook.F90:15
type(fa_com), target, save fa_com_default
Definition: fa_mod.F90:476
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
subroutine farine64(KOPTIO)
Definition: farine.F90:344
subroutine farine(KOPTIO)
Definition: farine.F90:361
integer(kind=jplikb), parameter jpniil
Definition: fa_mod.F90:31