SURFEX v8.1
General documentation of Surfex
fadec1.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 fadec1_fort &
4 & (fa, krep, knumer, cdpref, knivau, cdsuff, &
5 & ldcosp, cdnoma, klnoma, kvalco, klongd, &
6 & pchamp, ldundf, pundf, ydgr1tab)
7 USE fa_mod, ONLY : fa_com, fagr1tab
8 USE parkind1, ONLY : jprb
9 USE yomhook , ONLY : lhook, dr_hook
10 USE lfi_precision
11 IMPLICIT NONE
12 !****
13 ! Sous-programme de controle et de DECODAGE d'un CHAMP HORIZONTAL
14 ! venant d'etre lu sur un fichier ARPEGE/ALADIN.
15 ! ( DECOdage de donnees )
16 !**
17 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
18 ! KNUMER (Entree) ==> Numero de l'unite logique;
19 ! CDPREF (Entree) ==> Prefixe eventuel du nom d'article;
20 ! KNIVAU (Entree) ==> Niveau vertical eventuel;
21 ! CDSUFF (Entree) ==> Suffixe eventuel du nom d'article;
22 ! LDCOSP (Entree) ==> Vrai si le champ est represente
23 ! par des coefficients spectraux;
24 ! CDNOMA (Sortie) ==> Nom de l'article-champ lu;
25 ! KLNOMA (Sortie) ==> Nombre de caracteres utiles dans
26 ! CDNOMA;
27 ! ( Tableau ) KVALCO (Entree) ==> Donnees issues de la lecture;
28 ! KLONGD (Entree) ==> Nombre de valeurs (mots de 64 bits
29 ! en principe) lues;
30 ! ( Tableau ) PCHAMP (Sortie) ==> Valeurs REELLES du champ lu.
31 ! LDUNDF (Sortie) ==> Vrai si ce champ a des valeurs
32 ! indefinies
33 ! PUNDF (Sortie) ==> Dans le cas ou LDUNDF est vrai,
34 ! valeur non definie
35 !
36 ! Remarques:
37 !
38 ! - KVALCO est type entier, et doit avoir une longueur
39 ! suffisante pour stocker les donnees codees. Le dimensionnement
40 ! "tous terrains" est (2+ILCHAM), qui permet le cas echeant de
41 ! stocker un champ a pleine resolution sans codage effectif.
42 ! (ILCHAM est le nombre de valeurs du champ a decoder)
43 !
44 ! - CDNOMA doit avoir au moins FA%JPXNOM caracteres.
45 !
46 !
47 TYPE(fa_com) :: FA
48 TYPE(fagr1tab) :: YDGR1TAB
49 INTEGER (KIND=JPLIKB) KREP, KNUMER, KNIVAU, KLNOMA, KLONGD
50 !
51 !
52 INTEGER (KIND=JPLIKB) IREP, ILPRFU, ILSUFU, ILNOMU
53 INTEGER (KIND=JPLIKB) IRANG, INIMES
54 INTEGER (KIND=JPLIKB) ILPREF, ILSUFF, ILCDNO, IRANGC, IVALC1
55 INTEGER (KIND=JPLIKB) IB1PAR (fa%jplb1p)
56 !
57 REAL (KIND=JPDBLR) PCHAMP (*), PUNDF
58 INTEGER (KIND=JPLIKB) KVALCO(*)
59 !
60 LOGICAL LLVERF, LLRLFI, LDCOSP, LLNOMU, LDUNDF
61 !
62 CHARACTER CDPREF*(*), CDSUFF*(*), CDNOMA*(*)
63 CHARACTER CLPREF*(fa%jpxnom), CLSUFF*(fa%jpxsuf)
64 !
65 CHARACTER(LEN=FA%JPLMES) CLMESS
66 CHARACTER(LEN=FA%JPLSPX) CLNSPR
67 LOGICAL LLFATA
68 
69 !**
70 ! 1. - CONTROLES ET INITIALISATIONS.
71 !-----------------------------------------------------------------------
72 !
73 REAL(KIND=JPRB) :: ZHOOK_HANDLE
74 IF (lhook) CALL dr_hook('FADEC1_MT',0,zhook_handle)
75 
76 llverf=.false.
77 llrlfi=.false.
78 llnomu=.false.
79 ilprfu=int(len(cdpref), jplikb)
80 ilsufu=int(len(cdsuff), jplikb)
81 ilcdno=int(len(cdnoma), jplikb)
82 klnoma=0
83 CALL fanumu_fort &
84 & (fa, knumer,irang)
85 !
86 IF (irang.EQ.0) THEN
87  irep=-51
88  GOTO 1001
89 ELSEIF (ilcdno.LT.fa%JPXNOM) THEN
90  irep=-65
91  GOTO 1001
92 ELSE
93  cdnoma=' '
94 ENDIF
95 !
96 ! Verrouillage eventuel du fichier.
97 !
98 IF (fa%LFAMUL) CALL lfiver_fort &
99 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'ON')
100 llverf=fa%LFAMUL
101 !
102 IF (fa%FICHIER(irang)%LCREAF) THEN
103  irep=-85
104  GOTO 1001
105 ENDIF
106 !**
107 ! 2. - FABRICATION DU NOM D'ARTICLE VIA LE SOUS-PROGRAMME "FANFAR"
108 ! ( controles de CDPREF, KNIVAU, CDSUFF inclus )
109 !-----------------------------------------------------------------------
110 !
111 CALL fanfar_fort &
112 & (fa, irep,irang,cdpref,knivau,cdsuff,cdnoma, &
113 & ib1par(6),ilprfu,ilsufu,ilnomu)
114 IF (irep.NE.0) GOTO 1001
115 llnomu=.true.
116 klnoma=ilnomu
117 !**
118 ! 3. - CONTROLE ET DECODAGE DE L'ARTICLE DEJA LU SUR LE FICHIER.
119 !-----------------------------------------------------------------------
120 !
121 !
122 ! Controle de l'homogeneite du type de rangement des coeff. spectraux
123 ! parmi les champs lus/ecrits: ces champs compactes avec
124 ! FA%NIGRIB=-1 ou 3 doivent etre ranges comme dans le modele ("verticalement"
125 ! soit selon des colonnes JM=cst consecutives) et contrairement si compactes
126 ! avec FA%NIGRIB= 0,1 ou 2.
127 !
128 irangc=fa%FICHIER(irang)%NUCADR
129 ivalc1=kvalco(1)
130 IF (ldcosp) THEN
131  IF (ivalc1.EQ.-1.OR.ivalc1.EQ.3) THEN
132  fa%FICHIER(irang)%NRASVE=fa%FICHIER(irang)%NRASVE+1
133  IF (fa%FICHIER(irang)%NRASVE.EQ.1.AND.fa%FICHIER(irang)%NRASHO.GT.0) THEN
134  WRITE(fa%NULOUT,*) &
135 & '------------------------------------------------'
136  WRITE(fa%NULOUT,*)' FADEC1 : WARNING !!!!! '
137  WRITE(fa%NULOUT,*)' Un champ de coeff. spectraux avec'
138  WRITE(fa%NULOUT,*) &
139 & ' rangement type modele va etre lu alors que'
140  WRITE(fa%NULOUT,*) &
141 & ' d''autres champs spect. ont un rangt different.'
142  WRITE(fa%NULOUT,*) &
143 & ' *** Prenez en compte cette heterogeneite! ***'
144  WRITE(fa%NULOUT,*) &
145 & '------------------------------------------------'
146  ENDIF
147  ELSEIF (ivalc1.GE.0.AND.ivalc1.LE.2) THEN
148  fa%FICHIER(irang)%NRASHO=fa%FICHIER(irang)%NRASHO+1
149  IF (fa%FICHIER(irang)%NRASHO.EQ.1.AND.fa%FICHIER(irang)%NRASVE.GT.0) THEN
150  WRITE(fa%NULOUT,*) &
151 & '------------------------------------------------'
152  WRITE(fa%NULOUT,*)' FADEC1 : WARNING !!!!! '
153  WRITE(fa%NULOUT,*)' Un champ de coeff. spectraux avec'
154  WRITE(fa%NULOUT,*) &
155 & ' rangement autre que celui du modele va etre lu'
156  WRITE(fa%NULOUT,*) &
157 & ' alors que d''autres champs ont le rangt modele'
158  WRITE(fa%NULOUT,*) &
159 & ' *** Prenez en compte cette heterogeneite! ***'
160  WRITE(fa%NULOUT,*) &
161 & '------------------------------------------------'
162  ENDIF
163  ENDIF
164 ENDIF
165 !
166 IF (falgra(ivalc1)) THEN
167 ! Cas d'un champ gribe avec GRIB_API
168  CALL fadgra_fort &
169 & (fa, irep, irang, cdnoma(1:ilnomu), kvalco, &
170 & klongd, pchamp, ldcosp, cdpref, knivau, cdsuff, &
171 & ldundf, pundf)
172 ELSEIF (ivalc1.EQ.3) THEN
173 ! Cas d'un champ gribe avec GRIBEX
174  CALL fadecx_fort &
175 & (fa, irep, irang, cdnoma(1:ilnomu), kvalco, &
176 & klongd, pchamp, ldcosp, cdpref, knivau, cdsuff, &
177 & ldundf, pundf, ydgr1tab)
178 ELSEIF (ivalc1.EQ.4) THEN
179  CALL fadcpl_fort &
180 & (fa, irep, irang, cdnoma(1:ilnomu), kvalco, &
181 & klongd, pchamp, ldcosp, ldundf, pundf)
182 ELSE
183  CALL fadeci_fort &
184 & (fa, irep, irang, cdnoma(1:ilnomu), kvalco, &
185 & klongd, pchamp, ldcosp )
186 ENDIF
187 !**
188 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
189 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
190 !-----------------------------------------------------------------------
191 !
192 1001 CONTINUE
193 krep=irep
194 llfata=llmoer(irep,irang)
195 !
196 ! Deverrouillage eventuel du fichier.
197 !
198 IF (llverf) CALL lfiver_fort &
199 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'OFF')
200 !
201 IF (llfata) THEN
202  inimes=2
203 ELSE
204  inimes=ixnvms(irang)
205 ENDIF
206 !
207 IF (.NOT.llfata.AND.inimes.NE.2) THEN
208  IF (lhook) CALL dr_hook('FADEC1_MT',1,zhook_handle)
209  RETURN
210 ENDIF
211 !
212 clnspr='FADEC1'
213 !
214 IF (ilprfu.GE.1) THEN
215  ilpref=min(ilprfu,int(len(clpref), jplikb))
216  clpref(1:ilpref)=cdpref(1:ilpref)
217 ELSE
218  ilpref=8
219  clpref(1:ilpref)=fa%CHAINC(:ilpref)
220 ENDIF
221 !
222 IF (ilsufu.GE.1) THEN
223  ilsuff=min(ilsufu,int(len(clsuff), jplikb))
224  clsuff(1:ilsuff)=cdsuff(1:ilsuff)
225 ELSE
226  ilsuff=8
227  clsuff(1:ilsuff)=fa%CHAINC(:ilsuff)
228 ENDIF
229 !
230 IF (.NOT.llnomu) THEN
231  ilnomu=min(ilpref,fa%NCPCAD)
232  cdnoma(1:ilnomu)=clpref(1:ilpref)
233 ENDIF
234 !
235 WRITE (unit=clmess,fmt='(''KREP='',I4,'', KNUMER='',I3, &
236 & '', CDPREF='''''',A,'''''', KNIVAU='',I6, &
237 & '', CDSUFF='''''',A,'''''', LDCOSP= '',L1)') &
238 & krep,knumer,clpref(1:ilpref),knivau,clsuff(1:ilsuff),ldcosp
239 CALL faipar_fort &
240 & (fa, knumer,inimes,irep,llfata,clmess, &
241 & clnspr,cdnoma(1:ilnomu),llrlfi)
242 !
243 IF (lhook) CALL dr_hook('FADEC1_MT',1,zhook_handle)
244 
245 CONTAINS
246 
247 #include "facom2.llmoer.h"
248 #include "facom2.ixnvms.h"
249 #include "falgra.h"
250 
251 END SUBROUTINE fadec1_fort
integer, parameter jplikb
subroutine fadcpl_fort(FA, KREP, KRANG, CDNOMA, KVALCO, KLONGA, PCHAMP, LDCOSP, LDUNDF, PUNDF)
Definition: fadcpl.F90:4
subroutine fadgra_fort(FA, KREP, KRANG, CDNOMA, KVALCO, KLONGA, PCHAMP, LDCOSP, CDPREF, KNIVAU, CDSUFF, LDUNDF, PUNDF)
Definition: fadgra.F90:7
subroutine fadecx_fort(FA, KREP, KRANG, CDNOMA, KVALCO, KLONGA, PCHAMP, LDCOSP, CDPREF, KNIVAU, CDSUFF, LDUNDF, PUNDF, YDGR1TAB)
Definition: fadecx.F90:7
Definition: fa_mod.F90:1
subroutine lfiver_fort(LFI, PVEROU, CDSENS)
Definition: lfiver.F90:6
integer, parameter jprb
Definition: parkind1.F90:32
subroutine fanfar_fort(FA, KREP, KRANG, CDPREF, KNIVAU, CDSUFF, CDNOMA, KB1PAR, KLPRFU, KLSUFU, KLNOMU)
Definition: fanfar.F90:6
logical lhook
Definition: yomhook.F90:15
subroutine fadeci_fort(FA, KREP, KRANG, CDNOMA, KVALCO, KLONGA, PCHAMP, LDCOSP)
Definition: fadeci.F90:7
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
subroutine fadec1_fort(FA, KREP, KNUMER, CDPREF, KNIVAU, CDSUFF, LDCOSP, CDNOMA, KLNOMA, KVALCO, KLONGD, PCHAMP, LDUNDF, PUNDF, YDGR1TAB)
Definition: fadec1.F90:7
subroutine fanumu_fort(FA, KNUMER, KRANG)
Definition: fanumu.F90:5