SURFEX v8.1
General documentation of Surfex
faregi.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 faregi_fort &
4 & (fa, cdclef, kval, kopt)
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 controle (lecture/ecriture) les options
12 ! de compression de GRIBEX implicites.
13 ! (REGlage des options Implicites de codage de gribex)
14 !**
15 ! Arguments : CDCLEF (Entree) ==> Mot clef precisant l'action a faire;
16 ! KVAL (Sortie ==> Valeur lue ou ecrite;
17 ! ou Entree)
18 ! KOPT (Entree) ==> Flag: 0->lecture 1->ecriture;
19 !*
20 ! Signification des divers elements du tableau FA%NCODGRI
21 !
22 ! NCODGRI(1) = type de codage (0->option HOPER='C'; 1->option HOPER='K')
23 ! NCODGRI(2) = KSEC4(6), indicateur de la presence de flags
24 ! additionnels (0->non; 16->oui)
25 ! NCODGRI(3) = KSEC4(7)
26 ! NCODGRI(4) = KSEC4(9), indicateur de la presence de bitmaps
27 ! secondaires (0->non; 32->oui)
28 ! NCODGRI(5) = KSEC4(10), indicateur pour le nb de bits des
29 ! groupes de pts de grille (0->const.; 16->different)
30 ! NCODGRI(6) = KSEC4(11), nb de bits pour les groupes de pts de
31 ! grille, quand il est constant.
32 ! Si negatif, le logiciel calcule un nb optimal a partir
33 ! de -KSEC4(11).
34 ! NCODGRI(7) = KSEC4(12), indicateur pour les extensions generales de la
35 ! compression (0->non; 8->oui)
36 ! NCODGRI(8) = KSEC4(13), indicateur pour le rearrangement boustrophedo
37 ! nique (0->non; 4->oui)
38 ! NCODGRI(9) = KSEC4(14) (valeurs possibles: -1, 0 et 2)
39 ! NCODGRI(10) = KSEC4(15) (valeurs possibles: -1, 0 et 1), sert avec
40 ! KSEC4(14) a definir la technique de la difference
41 ! spatiale.Si l'un des 2 est negatif, l'ordre de
42 ! differentiation est estime dynamiquement, sinon
43 ! l'ordre vaut KSEC4(14)+KSEC4(15)
44 ! NCODGRI(11) = 1->Calcul automatique de KSEC1 (23), 0->On laisse faire
45 ! NCODGRI(12) = Ecriture des champs GRIB1 dans un fichier externe
46 !
47 !
48 !
49 TYPE(fa_com) :: FA
50 INTEGER (KIND=JPLIKB) KVAL, KOPT
51 !
52 CHARACTER(LEN=*) CDCLEF
53 !
54 INTEGER (KIND=JPLIKB) INUMER, INIMES, IREP, INBITSMAX
55 CHARACTER(LEN=FA%JPLMES) CLMESS
56 CHARACTER(LEN=FA%JPLSPX) CLNSPR
57 LOGICAL LLFATA
58 
59 !
60 !
61 !
62 !**
63 ! 0. - INITIALISATIONS ET ALLOCATIONS PREALABLES
64 !-----------------------------------------------------------------------
65 !
66 REAL(KIND=JPRB) :: ZHOOK_HANDLE
67 IF (lhook) CALL dr_hook('FAREGI_MT',0,zhook_handle)
68 irep=0
69 IF (fa%FAREGI_LLPREA) THEN
70 !
71 ! A la premiere utilisation, appel au sous-programme "FARINE".
72 !
73  CALL farine_fort &
74 & (fa, 2_jplikb )
75  fa%FAREGI_LLPREA=.false.
76 ENDIF
77 inbitsmax=max(fa%NBIPDG,fa%NBICSP)
78 !
79 !**
80 ! 1. - SPECIFICATION D'UN NOUVEAU CODAGE
81 !-----------------------------------------------------------------------
82 !
83 IF (kopt==1) THEN
84 !
85 ! Pas de compression (sous-tronc et puissance laplacien
86 ! ajoutees systematiquement + tard pour les coeff spectraux)
87 !
88  IF (cdclef=='BASIC'.OR.cdclef=='basic') THEN
89  fa%NCODGRI(1)=0
90  fa%NCODGRI(2)=0
91  fa%NCODGRI(3)=0
92  fa%NCODGRI(4)=0
93  fa%NCODGRI(5)=0
94  fa%NCODGRI(6)=0
95  ELSEIF (cdclef=='IDCEN'.OR.cdclef=='idcen') THEN
96  fa%NIDCEN = kval
97 !
98 ! Comme le "BASIC" avec une compression
99 ! ligne a ligne pour les points de grille
100 !
101  ELSEIF (cdclef=='PACK1'.OR.cdclef=='pack1') THEN
102  fa%NCODGRI(1)=0
103  fa%NCODGRI(2)=16
104  fa%NCODGRI(3)=0
105  fa%NCODGRI(4)=0
106  fa%NCODGRI(5)=16
107  fa%NCODGRI(6)=0
108 !
109 ! Comme le "BASIC" avec une compression
110 ! pour les points de grille ou le nb de bits est le meme
111 ! dans chaque groupe de points de grille
112 !
113  ELSEIF (cdclef=='PACK2'.OR.cdclef=='pack2') THEN
114  fa%NCODGRI(1)=0
115  fa%NCODGRI(2)=16
116  fa%NCODGRI(3)=0
117  fa%NCODGRI(4)=32
118  fa%NCODGRI(5)=0
119 ! Un nb de bits optimal sera recherche par le logiciel
120  fa%NCODGRI(6)=-99
121 !
122 ! Comme le "BASIC" avec une compression
123 ! "OMM general" pour les points de grille
124 !
125  ELSEIF (cdclef=='PACK3'.OR.cdclef=='pack3') THEN
126  fa%NCODGRI(1)=0
127  fa%NCODGRI(2)=16
128  fa%NCODGRI(3)=0
129  fa%NCODGRI(4)=32
130  fa%NCODGRI(5)=16
131  fa%NCODGRI(6)=0
132 !
133 ! Compression "aggressive": le logiciel va
134 ! tenter la compression ligne a ligne et comparer la
135 ! longueur de message obtenue avec celle en l'absence de
136 ! compression et au final retenir la meilleure solution.
137 !
138  ELSEIF (cdclef=='APAC1'.OR.cdclef=='apac1') THEN
139  fa%NCODGRI(1)=1
140  fa%NCODGRI(2)=16
141  fa%NCODGRI(3)=0
142  fa%NCODGRI(4)=0
143  fa%NCODGRI(5)=16
144  fa%NCODGRI(6)=0
145 !
146 ! Compression "aggressive": le logiciel va
147 ! suivre la demarche "APAC1" en testant en plus le nb de bits
148 ! constant par groupe de pts de grille et retenir la meilleure
149 ! compression
150 !
151  ELSEIF (cdclef=='APAC2'.OR.cdclef=='apac2') THEN
152  fa%NCODGRI(1)=1
153  fa%NCODGRI(2)=16
154  fa%NCODGRI(3)=0
155  fa%NCODGRI(4)=0
156  fa%NCODGRI(5)=0
157 ! Un nb de bits optimal sera recherche par le logiciel
158  fa%NCODGRI(6)=-99
159 !
160 ! Compression "aggressive": le logiciel va
161 ! suivre la demarche "APAC1" en testant en plus la compression
162 ! "general OMM" et retenir la meilleure compression.
163 !
164  ELSEIF (cdclef=='APAC3'.OR.cdclef=='apac3') THEN
165  fa%NCODGRI(1)=1
166  fa%NCODGRI(2)=16
167  fa%NCODGRI(3)=0
168  fa%NCODGRI(4)=32
169  fa%NCODGRI(5)=16
170  fa%NCODGRI(6)=0
171 !
172 ! Compression "aggressive": le logiciel va
173 ! suivre la demarche "APAC3" en testant en plus le nb de bits
174 ! constant par groupe de pts de grille et retenir la meilleure
175 ! compression.
176 !
177  ELSEIF (cdclef=='APAC4'.OR.cdclef=='apac4') THEN
178  fa%NCODGRI(1)=1
179  fa%NCODGRI(2)=16
180  fa%NCODGRI(3)=0
181  fa%NCODGRI(4)=32
182  fa%NCODGRI(5)=0
183 ! Un nb de bits optimal sera recherche par le logiciel
184  fa%NCODGRI(6)=-99
185 !
186 ! Specification du nb de bits a utiliser dans le cadre
187 ! de la compression avec nb de bits constant
188 ! par groupe de pts de grille
189 !
190  ELSEIF (cdclef=='WIDPA'.OR.cdclef=='widpa') THEN
191  IF (kval.LT.1-inbitsmax.OR.kval.GT.inbitsmax-1) THEN
192  irep=-97
193  GOTO 1001
194  ENDIF
195  fa%NCODGRI(6)=kval
196 !
197 ! Demande supplementaire de l'extension generale de la compression
198 ! (si KVAL=1, sinon c'est le retrait de cette option)
199 !
200  ELSEIF (cdclef=='GEXTE'.OR.cdclef=='gexte') THEN
201  IF (kval.EQ.1) THEN
202  fa%IOPTGRSX2O=1
203  fa%NCODGRI(7)=8
204  ELSE
205  fa%NCODGRI(7)=0
206  ENDIF
207 !
208 ! Demande supplementaire du rearrangement boustrophedonique dans la
209 ! compression (si KVAL=1, sinon c'est le retrait de cette option)
210 !
211  ELSEIF (cdclef=='BOUST'.OR.cdclef=='boust') THEN
212  IF (kval.EQ.1) THEN
213  fa%IOPTGRSX2O=1
214  fa%NCODGRI(8)=4
215  ELSE
216  fa%NCODGRI(8)=0
217  ENDIF
218 !
219 ! Demande supplementaire de la difference spatiale dans la compression.
220 ! KVAL donne l'ordre de differentiation:
221 ! -1-> calcul dynamique par GRIBEX; 1 a 3->ordre; 0->desactiv; autre->err
222 !
223  ELSEIF (cdclef=='DIFFE'.OR.cdclef=='diffe') THEN
224  IF (kval.EQ.-1) THEN
225  fa%IOPTGRSX2O=1
226  fa%IOPTGRSN2O=1
227  fa%NCODGRI( 9)=0
228  fa%NCODGRI(10)=-1
229  ELSEIF (kval.EQ.1) THEN
230  fa%IOPTGRSX2O=1
231  fa%IOPTGRSN2O=1
232  fa%NCODGRI( 9)=0
233  fa%NCODGRI(10)=1
234  ELSEIF (kval.EQ.2) THEN
235  fa%IOPTGRSX2O=1
236  fa%IOPTGRSN2O=1
237  fa%NCODGRI( 9)=2
238  fa%NCODGRI(10)=0
239  ELSEIF (kval.EQ.3) THEN
240  fa%IOPTGRSX2O=1
241  fa%IOPTGRSN2O=1
242  fa%NCODGRI( 9)=2
243  fa%NCODGRI(10)=1
244  ELSEIF (kval.EQ.0) THEN
245  fa%IOPTGRSX2O=0
246  fa%NCODGRI( 9)=0
247  fa%NCODGRI(10)=0
248  ELSE
249  irep=-125
250  GOTO 1001
251  ENDIF
252 !
253 ! Facteur decimal; calcul automatique
254 !
255  ELSEIF (cdclef=='FACDEC'.OR.cdclef=='facdec') THEN
256  fa%NCODGRI(11)=kval
257 !
258 ! Ecriture dans un fichier externe
259 !
260  ELSEIF (cdclef=='EXTERN'.OR.cdclef=='extern') THEN
261  fa%NCODGRI(12)=kval
262  ENDIF
263 !**
264 ! 2. - DEMANDE D'INFORMATION
265 !-----------------------------------------------------------------------
266 !
267 ELSEIF (kopt==0) THEN
268 !
269 ! Obtention des mots-clef disponibles
270 !
271  IF (cdclef=='CLEFS'.OR.cdclef=='clefs') THEN
272  kval=0
273  WRITE (unit=fa%NULOUT,fmt=*)
274  WRITE (unit=fa%NULOUT,fmt=*) 'Mots clef disponibles pour FAREGI:'
275  WRITE (unit=fa%NULOUT,fmt=*)
276  WRITE (unit=fa%NULOUT,fmt=*) 'BASIC: pas de compression'
277  WRITE (unit=fa%NULOUT,fmt=*) 'PACK1: BASIC avec une compression'
278  WRITE (unit=fa%NULOUT,fmt=*) ' ligne a ligne pour les pts de grille'
279  WRITE (unit=fa%NULOUT,fmt=*) 'PACK2: BASIC avec une compression'
280  WRITE (unit=fa%NULOUT,fmt=*) ' ou le nb de bits est cst pour les groupes'
281  WRITE (unit=fa%NULOUT,fmt=*) 'PACK3: BASIC avec une compression'
282  WRITE (unit=fa%NULOUT,fmt=*) ' OMM general pour les points de grille'
283  WRITE (unit=fa%NULOUT,fmt=*) 'APAC1: compression agressive'
284  WRITE (unit=fa%NULOUT,fmt=*) ' BASIC et PACK1 sont testes'
285  WRITE (unit=fa%NULOUT,fmt=*) 'APAC2: compression agressive'
286  WRITE (unit=fa%NULOUT,fmt=*) ' BASIC, PACK1 et PACK2 sont testes'
287  WRITE (unit=fa%NULOUT,fmt=*) 'APAC3: compression agressive'
288  WRITE (unit=fa%NULOUT,fmt=*) ' BASIC, PACK1 et PACK3 sont testes'
289  WRITE (unit=fa%NULOUT,fmt=*) 'APAC4: compression agressive'
290  WRITE (unit=fa%NULOUT,fmt=*) ' BASIC, PACK1, PACK2 et PACK3 testes'
291  WRITE (unit=fa%NULOUT,fmt=*) 'WIDPA: lecture/ecriture du nb de bits'
292  WRITE (unit=fa%NULOUT,fmt=*) ' a utiliser pour les groupes de points'
293  WRITE (unit=fa%NULOUT,fmt=*) ' de grille dans le cas PACK2'
294  WRITE (unit=fa%NULOUT,fmt=*) 'GEXTE: les extensions generales de la compression'
295  WRITE (unit=fa%NULOUT,fmt=*) ' sont activees (KVAL=1) ou desactiv. (KVAL=0)'
296  WRITE (unit=fa%NULOUT,fmt=*) 'BOUST: le rearrangement boustrophedonique est'
297  WRITE (unit=fa%NULOUT,fmt=*) ' active (KVAL=1) ou desactive (KVAL=0)'
298  WRITE (unit=fa%NULOUT,fmt=*) 'DIFFE: la differenciation spatiale est'
299  WRITE (unit=fa%NULOUT,fmt=*) ' activee (KVAL=ordre de differ. (1 a 3)'
300  WRITE (unit=fa%NULOUT,fmt=*) ' ou -1 (calcul dyn)) ou desactivee (0)'
301  WRITE (unit=fa%NULOUT,fmt=*) 'FACDEC: calcul automatique du facteur decimal'
302  WRITE (unit=fa%NULOUT,fmt=*) 'EXTERN: ecriture dans un fichier externe'
303  WRITE (unit=fa%NULOUT,fmt=*)
304  ELSEIF (cdclef=='IDCEN'.OR.cdclef=='idcen') THEN
305  kval = fa%NIDCEN
306 !
307 ! Lecture du nb de bits a utiliser dans le cadre
308 ! de la compression avec nb de bits constant
309 ! par groupe de pts de grille
310 !
311  ELSEIF (cdclef=='WIDPA'.OR.cdclef=='widpa') THEN
312  kval=fa%NCODGRI(6)
313 !
314 ! Lecture de la presence ou non de la compression
315 ! "general extended"
316 !
317  ELSEIF (cdclef=='GEXTE'.OR.cdclef=='gexte') THEN
318  kval = fa%NCODGRI(7) / 8
319 !
320 ! Lecture de la presence ou non du rearrangement
321 ! boustrophedonique.
322 !
323  ELSEIF (cdclef=='BOUST'.OR.cdclef=='boust') THEN
324  kval = fa%NCODGRI(8) / 4
325 !
326 ! Lecture de la presence ou non de la differentiation spatiale
327 !
328  ELSEIF (cdclef=='DIFFE'.OR.cdclef=='diffe') THEN
329  kval=fa%NCODGRI( 9)+fa%NCODGRI(10)
330 !
331 ! Facteur decimal; calcul automatique
332 !
333  ELSEIF (cdclef=='FACDEC'.OR.cdclef=='facdec') THEN
334  kval=fa%NCODGRI(11)
335 !
336 ! Ecriture dans un fichier externe
337 !
338  ELSEIF (cdclef=='EXTERN'.OR.cdclef=='extern') THEN
339  kval=fa%NCODGRI(12)
340  ELSE
341  irep=-125
342  GOTO 1001
343  ENDIF
344 !**
345 ! 3. - OPTION INCONNUE
346 !-----------------------------------------------------------------------
347 !
348 ELSE
349  irep=-125
350  GOTO 1001
351 ENDIF
352 !**
353 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
354 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
355 !-----------------------------------------------------------------------
356 !
357 1001 CONTINUE
358 llfata=llmoer(irep,0_jplikb )
359 !
360 IF (llfata) THEN
361  inimes=2
362 ELSE
363  inimes=fa%NIMSGA
364 ENDIF
365 !
366 IF (inimes.EQ.0) THEN
367  IF (lhook) CALL dr_hook('FAREGI_MT',1,zhook_handle)
368  RETURN
369 ENDIF
370 !
371 clnspr='FAREGI'
372 inumer=jpniil
373 !
374 WRITE (unit=clmess,fmt='(''IREP='',I2, &
375 & '', CDCLEF='''''',A,'''''', KVAL='',I12, &
376 & '', KOPT='',I4)') &
377 & irep,cdclef,kval,kopt
378 inumer=jpniil
379 CALL faipar_fort &
380 & (fa, inumer,inimes,irep,llfata,clmess, &
381 & clnspr,clnspr,.false.)
382 !
383 IF (lhook) CALL dr_hook('FAREGI_MT',1,zhook_handle)
384 
385 CONTAINS
386 
387 #include "facom2.llmoer.h"
388 
389 END SUBROUTINE faregi_fort
390 
391 
392 
393 ! Oct-2012 P. Marguinaud 64b LFI
394 SUBROUTINE faregi64 &
395 & (cdclef, kval, kopt)
396 USE fa_mod, ONLY : fa => fa_com_default, &
399 USE lfi_precision
400 IMPLICIT NONE
401 ! Arguments
402 CHARACTER (LEN=*) CDCLEF ! IN
403 INTEGER (KIND=JPLIKB) KVAL ! INOUT
404 INTEGER (KIND=JPLIKB) KOPT ! IN
405 
406 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
407 
408 CALL faregi_fort &
409 & (fa, cdclef, kval, kopt)
410 
411 END SUBROUTINE faregi64
412 
413 SUBROUTINE faregi &
414 & (cdclef, kval, kopt)
415 USE fa_mod, ONLY : fa => fa_com_default, &
418 USE lfi_precision
419 IMPLICIT NONE
420 ! Arguments
421 CHARACTER (LEN=*) CDCLEF ! IN
422 INTEGER (KIND=JPLIKM) KVAL ! INOUT
423 INTEGER (KIND=JPLIKM) KOPT ! IN
424 
425 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
426 
427 CALL faregi_mt &
428 & (fa, cdclef, kval, kopt)
429 
430 END SUBROUTINE faregi
431 
432 SUBROUTINE faregi_mt &
433 & (fa, cdclef, kval, kopt)
434 USE fa_mod, ONLY : fa_com
435 USE lfi_precision
436 IMPLICIT NONE
437 ! Arguments
438 type(fa_com) fa ! INOUT
439 CHARACTER (LEN=*) CDCLEF ! IN
440 INTEGER (KIND=JPLIKM) KVAL ! INOUT
441 INTEGER (KIND=JPLIKM) KOPT ! IN
442 ! Local integers
443 INTEGER (KIND=JPLIKB) IVAL ! INOUT
444 INTEGER (KIND=JPLIKB) IOPT ! IN
445 ! Convert arguments
446 
447 IF (kopt==1) THEN
448  ival = int( kval, jplikb)
449 ENDIF
450 iopt = int( kopt, jplikb)
451 
452 CALL faregi_fort &
453 & (fa, cdclef, ival, iopt)
454 
455 IF (kopt==0) THEN
456  kval = int( ival, jplikm)
457 ENDIF
458 
459 END SUBROUTINE faregi_mt
460 
461 !INTF CDCLEF IN
462 !INTF KVAL INOUT IN_IF=KOPT==1 OUT_IF=KOPT==0
463 !INTF KOPT 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
integer, parameter jprb
Definition: parkind1.F90:32
subroutine faregi_fort(FA, CDCLEF, KVAL, KOPT)
Definition: faregi.F90:5
subroutine farine_fort(FA, KOPTIO)
Definition: farine.F90:5
subroutine faregi(CDCLEF, KVAL, KOPT)
Definition: faregi.F90:415
logical lhook
Definition: yomhook.F90:15
subroutine faregi_mt(FA, CDCLEF, KVAL, KOPT)
Definition: faregi.F90:434
integer, parameter jplikm
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 faregi64(CDCLEF, KVAL, KOPT)
Definition: faregi.F90:396
integer(kind=jplikb), parameter jpniil
Definition: fa_mod.F90:31