SURFEX v8.1
General documentation of Surfex
facil1.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 facil1_fort &
4 & (fa, krep, knumer, cdpref, knivau, cdsuff, &
5 & pchamp, ldcosp, ldundf, pundf, ydgr1tab)
6 USE fa_mod, ONLY : fa_com, fagr1tab
7 USE parkind1, ONLY : jprb
8 USE yomhook , ONLY : lhook, dr_hook
10 IMPLICIT NONE
11 !****
12 ! Sous-programme de LECTURE d'un CHAMP HORIZONTAL sur un fichier
13 ! ARPEGE.
14 ! ( Champ d'Interet en LEcture )
15 !**
16 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
17 ! KNUMER (Entree) ==> Numero de l'unite logique;
18 ! CDPREF (Entree) ==> Prefixe eventuel du nom d'article;
19 ! KNIVAU (Entree) ==> Niveau vertical eventuel;
20 ! CDSUFF (Entree) ==> Suffixe eventuel du nom d'article;
21 ! ( Tableau ) PCHAMP (Sortie) ==> Valeurs REELLES du champ lu;
22 ! LDCOSP (Entree) ==> Vrai si le champ est represente
23 ! par des coefficients spectraux.
24 ! LDUNDF (Sortie) ==> Vrai si ce champ a des valeurs
25 ! indefinies
26 ! PUNDF (Sortie) ==> Dans le cas ou LDUNDF est vrai,
27 ! valeur non definie
28 ! MODIF:
29 ! JM AUDOIN GMAP/EXT 10/05/95 intro de IVALC3 pour eviter ecrasement
30 ! D PARADIS TTI/DEV 12/10/98 partie controle et decodage de l'article
31 ! demenagee dans un ss-prg a usage interne
32 ! du logiciel (FADECI).
33 ! D PARADIS DSI/DEV 15/04/04 nettoyage code + declaration IVALCO en
34 ! ALLOCATABLE
35 !
36 !
37 TYPE(fa_com) :: FA
38 TYPE(fagr1tab) :: YDGR1TAB
39 INTEGER (KIND=JPLIKB) KREP, KNUMER, KNIVAU
40 !
41 INTEGER (KIND=JPLIKB) IREP, ILPRFU, ILSUFU, ILNOMU
42 INTEGER (KIND=JPLIKB) ILONGA, IRANG, INIMES
43 INTEGER (KIND=JPLIKB) ILPREF, ILSUFF, IPOSEX, IRANGC
44 !
45 REAL (KIND=JPDBLR) PCHAMP (*)
46 REAL (KIND=JPRB) PUNDF
47 INTEGER (KIND=JPLIKB), ALLOCATABLE :: IVALCO(:)
48 INTEGER (KIND=JPLIKB) IB1PAR (fa%jplb1p)
49 !
50 LOGICAL LLVERF, LLRLFI, LDCOSP, LLNOMU, LDUNDF
51 !
52 CHARACTER CDPREF*(*), CDSUFF*(*)
53 CHARACTER CLPREF*(fa%jpxnom), CLSUFF*(fa%jpxsuf)
54 !
55 CHARACTER(LEN=FA%JPXNOM) CLNOMA
56 CHARACTER(LEN=FA%JPLMES) CLMESS
57 CHARACTER(LEN=FA%JPLSPX) CLNSPR
58 LOGICAL LLFATA
59 !**
60 ! 1. - CONTROLES ET INITIALISATIONS.
61 !-----------------------------------------------------------------------
62 !
63 REAL(KIND=JPRB) :: ZHOOK_HANDLE
64 IF (lhook) CALL dr_hook('FACIL1_MT',0,zhook_handle)
65 
66 llverf=.false.
67 llrlfi=.false.
68 llnomu=.false.
69 ilprfu=int(len(cdpref), jplikb)
70 ilsufu=int(len(cdsuff), jplikb)
71 CALL fanumu_fort &
72 & (fa, knumer,irang)
73 !
74 IF (irang.EQ.0) THEN
75  irep=-51
76  GOTO 1001
77 ENDIF
78 !
79 ! Verrouillage eventuel du fichier.
80 !
81 IF (fa%LFAMUL) CALL lfiver_fort &
82 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'ON')
83 llverf=fa%LFAMUL
84 !
85 IF (fa%FICHIER(irang)%LCREAF) THEN
86  irep=-85
87  GOTO 1001
88 ENDIF
89 !**
90 ! 2. - FABRICATION DU NOM D'ARTICLE VIA LE SOUS-PROGRAMME "FANFAR"
91 ! ( controles de CDPREF, KNIVAU, CDSUFF inclus )
92 !-----------------------------------------------------------------------
93 !
94 CALL fanfar_fort &
95 & (fa, irep,irang,cdpref,knivau,cdsuff,clnoma, &
96 & ib1par(6),ilprfu,ilsufu,ilnomu)
97 IF (irep.NE.0) GOTO 1001
98 llnomu=.true.
99 !**
100 ! 3. - LECTURE DE L'ARTICLE SUR LE FICHIER
101 !-----------------------------------------------------------------------
102 !
103 CALL lfinfo_fort &
104 & (fa%LFI, irep,knumer,clnoma(1:ilnomu), &
105 & ilonga,iposex)
106 !
107 IF (irep.NE.0) THEN
108  llrlfi=.true.
109  GOTO 1001
110 ELSEIF (ilonga.EQ.0) THEN
111  irep=-89
112  GOTO 1001
113 ELSEIF (ilonga.GT.fa%JPXCHA+2) THEN
114  irep=-90
115  GOTO 1001
116 ENDIF
117 !
118 ALLOCATE (ivalco(ilonga))
119 CALL lfilec_fort &
120 & (fa%LFI, irep,knumer,clnoma(1:ilnomu), &
121 & ivalco,ilonga)
122 llrlfi=irep.NE.0
123 IF (llrlfi) GOTO 1001
124 !
125 !**
126 ! 4. - CONTROLES ET DECODAGE DE L'ARTICLE
127 !----------------------------------------------
128 !
129 ! Controle de l'homogeneite du type de rangement de coeff. spectraux
130 ! parmi les champs lus/ecrits: ces champs compactes avec
131 ! FA%NIGRIB=-1 ou 3 doivent etre ranges comme dans le modele ("verticalement"
132 ! soit selon des colonnes JM=cst consecutives) et contrairement si compactes
133 ! avec FA%NIGRIB= 0,1 ou 2.
134 !
135 irangc=fa%FICHIER(irang)%NUCADR
136 IF (ldcosp) THEN
137  IF (ivalco(1).EQ.-1.OR.ivalco(1).EQ.3) THEN
138  fa%FICHIER(irang)%NRASVE=fa%FICHIER(irang)%NRASVE+1
139  IF (fa%FICHIER(irang)%NRASVE.EQ.1.AND.fa%FICHIER(irang)%NRASHO.GT.0) THEN
140  WRITE(fa%NULOUT,*) &
141 & '------------------------------------------------'
142  WRITE(fa%NULOUT,*)' FACIL1 : WARNING !!!!! '
143  WRITE(fa%NULOUT,*)' Un champ de coeff. spectraux avec'
144  WRITE(fa%NULOUT,*) &
145 & ' rangement type modele va etre lu alors que'
146  WRITE(fa%NULOUT,*) &
147 & ' d''autres champs spec. ont un rangt different.'
148  WRITE(fa%NULOUT,*) &
149 & ' *** Prenez en compte cette heterogeneite! ***'
150  WRITE(fa%NULOUT,*) &
151 & '------------------------------------------------'
152  ENDIF
153  ELSEIF (ivalco(1).GE.0.AND.ivalco(1).LE.2) THEN
154  fa%FICHIER(irang)%NRASHO=fa%FICHIER(irang)%NRASHO+1
155  IF (fa%FICHIER(irang)%NRASHO.EQ.1.AND.fa%FICHIER(irang)%NRASVE.GT.0) THEN
156  WRITE(fa%NULOUT,*) &
157 & '------------------------------------------------'
158  WRITE(fa%NULOUT,*)' FACIL1 : WARNING !!!!! '
159  WRITE(fa%NULOUT,*)' Un champ de coeff. spectraux avec'
160  WRITE(fa%NULOUT,*) &
161 & ' rangement autre que celui du modele va etre lu'
162  WRITE(fa%NULOUT,*) &
163 & ' alors que d''autres champs ont le rangt modele'
164  WRITE(fa%NULOUT,*) &
165 & ' *** Prenez en compte cette heterogeneite! ***'
166  WRITE(fa%NULOUT,*) &
167 & '------------------------------------------------'
168  ENDIF
169  ENDIF
170 ENDIF
171 !
172 IF (falgra(ivalco(1))) THEN
173 ! Cas d'un champ gribe avec GRIB_API
174  CALL fadgra_fort &
175 & (fa, irep,irang,clnoma, &
176 & ivalco,ilonga,pchamp,ldcosp,&
177 & cdpref, knivau, cdsuff, &
178 & ldundf, pundf)
179 ELSEIF (ivalco(1).EQ.3) THEN
180 ! Cas d'un champ gribe avec GRIBEX
181  CALL fadecx_fort &
182 & (fa, irep,irang,clnoma, &
183 & ivalco,ilonga,pchamp,ldcosp,&
184 & cdpref, knivau, cdsuff, &
185 & ldundf, pundf, ydgr1tab)
186 ELSEIF (ivalco(1).EQ.4) THEN
187  CALL fadcpl_fort &
188 & (fa, irep,irang,clnoma, &
189 & ivalco,ilonga,pchamp,ldcosp,&
190 & ldundf, pundf)
191 ELSE
192  CALL fadeci_fort &
193 & (fa, irep,irang,clnoma, &
194 & ivalco,ilonga,pchamp,ldcosp)
195 ENDIF
196 !
197 !**
198 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
199 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
200 !-----------------------------------------------------------------------
201 !
202 1001 CONTINUE
203 IF (ALLOCATED( ivalco )) DEALLOCATE ( ivalco )
204 krep=irep
205 llfata=llmoer(irep,irang)
206 !
207 ! Deverrouillage eventuel du fichier.
208 !
209 IF (llverf) CALL lfiver_fort &
210 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'OFF')
211 
212 IF (llfata) THEN
213  inimes=2
214 ELSE
215  inimes=ixnvms(irang)
216 ENDIF
217 !
218 IF (.NOT.llfata.AND.inimes.NE.2) THEN
219  IF (lhook) CALL dr_hook('FACIL1_MT',1,zhook_handle)
220  RETURN
221 ENDIF
222 !
223 clnspr='FACIL1'
224 !
225 IF (ilprfu.GE.1) THEN
226  ilpref=min(ilprfu,int(len(clpref), jplikb))
227  clpref(1:ilpref)=cdpref(1:ilpref)
228 ELSE
229  ilpref=8
230  clpref(1:ilpref)=fa%CHAINC(:ilpref)
231 ENDIF
232 !
233 IF (ilsufu.GE.1) THEN
234  ilsuff=min(ilsufu,int(len(clsuff), jplikb))
235  clsuff(1:ilsuff)=cdsuff(1:ilsuff)
236 ELSE
237  ilsuff=8
238  clsuff(1:ilsuff)=fa%CHAINC(:ilsuff)
239 ENDIF
240 !
241 IF (.NOT.llnomu) THEN
242  ilnomu=min(ilpref,fa%NCPCAD)
243  clnoma(1:ilnomu)=clpref(1:ilpref)
244 ENDIF
245 !
246 WRITE (unit=clmess,fmt='(''KREP='',I5,'', KNUMER='',I3, &
247 & '', CDPREF='''''',A,'''''', KNIVAU='',I6, &
248 & '', CDSUFF='''''',A,'''''', LDCOSP= '',L1)') &
249 & krep,knumer,clpref(1:ilpref),knivau,clsuff(1:ilsuff),ldcosp
250 CALL faipar_fort &
251 & (fa, knumer,inimes,irep,llfata,clmess, &
252 & clnspr, clnoma(1:ilnomu),llrlfi)
253 !
254 IF (lhook) CALL dr_hook('FACIL1_MT',1,zhook_handle)
255 
256 CONTAINS
257 
258 #include "facom2.llmoer.h"
259 #include "facom2.ixnvms.h"
260 #include "falgra.h"
261 
262 END SUBROUTINE facil1_fort
263 
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 lfinfo_fort(LFI, KREP, KNUMER, CDNOMA, KLONG, KPOSEX)
Definition: lfinfo.F90:6
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
subroutine lfilec_fort(LFI, KREP, KNUMER, CDNOMA, KTAB, KLONG)
Definition: lfilec.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 facil1_fort(FA, KREP, KNUMER, CDPREF, KNIVAU, CDSUFF, PCHAMP, LDCOSP, LDUNDF, PUNDF, YDGR1TAB)
Definition: facil1.F90:6
subroutine fanumu_fort(FA, KNUMER, KRANG)
Definition: fanumu.F90:5