SURFEX v8.1
General documentation of Surfex
fairme.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 fairme_fort &
4 & (fa, krep, knumer, cdsttu )
6 USE parkind1, ONLY : jprb
7 USE yomhook , ONLY : lhook, dr_hook
9 IMPLICIT NONE
10 !****
11 ! Sous-programme de FERMETURE d'une unite logique "Fichier ARPEGE"
12 !**
13 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
14 ! KNUMER (Entree) ==> Numero de l'unite logique;
15 ! CDSTTU (Entree) ==> "STATUS" eventuel pour "CLOSE".
16 !
17 !
18 !
19 TYPE(fa_com) :: FA
20 INTEGER (KIND=JPLIKB) KREP, KNUMER
21 !
22 INTEGER (KIND=JPLIKB) IREP, IRANG, J, IPOSNU
23 INTEGER (KIND=JPLIKB) IRANGC, INIMES, ILNOMC
24 !
25 CHARACTER(LEN=*) CDSTTU
26 CHARACTER(LEN=7) CLSTTU
27 !
28 LOGICAL LLSTTU, LLVERF, LLRLFI
29 !
30 CHARACTER(LEN=FA%JPXNOM) CLACTI
31 CHARACTER(LEN=FA%JPLMES) CLMESS
32 CHARACTER(LEN=FA%JPLSPX) CLNSPR
33 LOGICAL LLFATA
34 INTEGER (KIND=JPLIKM) IREP4
35 
36 !**
37 ! 1. - CONTROLES DES PARAMETRES D'APPEL, PUIS INITIALISATIONS.
38 !-----------------------------------------------------------------------
39 !
40 REAL(KIND=JPRB) :: ZHOOK_HANDLE
41 IF (lhook) CALL dr_hook('FAIRME_MT',0,zhook_handle)
42 clacti=''
43 irep=0
44 llverf=.false.
45 llrlfi=.false.
46 CALL fanumu_fort &
47 & (fa, knumer,irang)
48 !
49 ! Verrouillage global eventuel.
50 !
51 IF (fa%LFAMUL) CALL lfiver_fort &
52 & (fa%LFI, fa%VRGLAS,'ON')
53 !
54 IF (irang.EQ.0) THEN
55  irep=-51
56  GOTO 1001
57 ELSEIF (len(cdsttu).LE.0) THEN
58  irep=-65
59  GOTO 1001
60 ELSE
61  llsttu=cdsttu.EQ.'KEEP'.OR.cdsttu.EQ.'DELETE'
62 !
63  IF (llsttu) THEN
64  clsttu=cdsttu(1:min(len(cdsttu),len(clsttu)))
65  ELSE
66  clsttu='DEFAUT'
67  ENDIF
68 !
69 ENDIF
70 !
71 IF (fa%LFAMUL) CALL lfiver_fort &
72 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'ON')
73 llverf=fa%LFAMUL
74 !
75 IF (fa%FICHIER(irang)%LCREAF.AND..NOT.llsttu) THEN
76 !
77 ! On force le relachement d'un fichier "parasite".
78 !
79  llsttu=.true.
80  clsttu='DELETE'
81 ENDIF
82 !**
83 ! 2. - FERMETURE DU FICHIER, AU SENS DU LOGICIEL LFI.
84 !-----------------------------------------------------------------------
85 !
86 CALL lfifer_fort &
87 & (fa%LFI, irep,knumer,clsttu)
88 !
89 IF (irep.NE.0) THEN
90  llrlfi=.true.
91  GOTO 1001
92 ENDIF
93 IF (fa%FICHIER(irang)%NFILEP /= 0) THEN
94  CALL fi_fclose (irep4, fa%FICHIER(irang)%NFILEP)
95  fa%FICHIER(irang)%NFILEP = 0
96  irep = irep4
97  IF (irep /= 0) GOTO 1001
98 ENDIF
99 !**
100 ! 3. - "NETTOYAGE" DES TABLES AYANT PERMIS DE GERER LE FICHIER.
101 ! ( au moins celles ayant un caractere "global" )
102 !-----------------------------------------------------------------------
103 !
104 fa%FICHIER(irang)%NULOGI=jpniil
105 !
106 DO j=1,fa%NFIOUV
107 !
108 IF (fa%NULIND(j).EQ.irang) THEN
109  iposnu=j
110  GOTO 302
111 ENDIF
112 !
113 ENDDO
114 !
115 irep=-66
116 GOTO 1001
117 !
118 302 CONTINUE
119 !
120 fa%NFIOUV=fa%NFIOUV-1
121 !
122 DO j=iposnu,fa%NFIOUV
123 fa%NULIND(j)=fa%NULIND(j+1)
124 ENDDO
125 !
126 IF (fa%LFAMUL) THEN
127  CALL lfiver_fort &
128 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'OFF')
129  CALL lfiver_fort &
130 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'REL')
131 ENDIF
132 !
133 llverf=.false.
134 irangc=fa%FICHIER(irang)%NUCADR
135 fa%CADRE(irangc)%NULCAD=fa%CADRE(irangc)%NULCAD-1
136 !
137 ! Si le cadre auquel etait rattache le fichier n'a plus d'autre
138 ! fichier rattache, et qu'on ne devait pas conserver ce cadre,
139 ! on le supprime.
140 !
141 IF (fa%CADRE(irangc)%NULCAD.LE.0.AND. &
142 & (fa%CADRE(irangc)%NGARDE.EQ.0.OR. &
143 & (fa%CADRE(irangc)%NGARDE.EQ.1.AND. &
144 & .NOT.fa%LIGARD))) &
145 & CALL factui_fort &
146 & (fa, irep,irangc)
147 CALL free_fichier (fa%FICHIER(irang))
148 !**
149 ! 10. - PHASE TERMINALE : MESSAGERIE, AVEC "ABORT" EVENTUEL,
150 ! VIA LE SOUS-PROGRAMME "FAIPAR" .
151 !-----------------------------------------------------------------------
152 !
153 1001 CONTINUE
154 krep=irep
155 llfata=llmoer(irep,irang)
156 !
157 ! Deverrouillage(s) eventuel(s).
158 !
159 IF (llverf) CALL lfiver_fort &
160 & (fa%LFI, fa%FICHIER(irang)%VRFICH,'OFF')
161 IF (fa%LFAMUL) CALL lfiver_fort &
162 & (fa%LFI, fa%VRGLAS,'OFF')
163 !
164 IF (llfata) THEN
165  inimes=2
166 ELSE
167  inimes=ixnvms(irang)
168 ENDIF
169 !
170 IF (inimes.EQ.0) THEN
171  IF (lhook) CALL dr_hook('FAIRME_MT',1,zhook_handle)
172  RETURN
173 ENDIF
174 !
175 clnspr='FAIRME'
176 !
177 IF (irep.EQ.-65) THEN
178  ilnomc=8
179  clacti(1:ilnomc)=fa%CHAINC(:ilnomc)
180  ELSE
181  ilnomc=min( int(len(cdsttu), jplikb), &
182 & int(len(clacti), jplikb) )
183  clacti(1:ilnomc)=cdsttu(1:ilnomc)
184 ENDIF
185 !
186 IF (inimes.EQ.2) THEN
187 !
188  ilnomc=min(ilnomc,fa%NCPCAD)
189  WRITE (unit=clmess,fmt='(''KREP='',I4,'', KNUMER='',I3, &
190 & '', CDSTTU='''''',A,'''''''')') krep,knumer, &
191 & clacti(1:ilnomc)
192  CALL faipar_fort &
193 & (fa, knumer,inimes,irep,llfata, &
194 & clmess,clnspr, &
195 & clacti(1:ilnomc),llrlfi)
196 !
197 ENDIF
198 !
199 IF (lhook) CALL dr_hook('FAIRME_MT',1,zhook_handle)
200 
201 CONTAINS
202 
203 #include "facom2.llmoer.h"
204 #include "facom2.ixnvms.h"
205 
206 END SUBROUTINE fairme_fort
207 
208 
209 
210 ! Oct-2012 P. Marguinaud 64b LFI
211 SUBROUTINE fairme64 &
212 & (krep, knumer, cdsttu)
213 USE fa_mod, ONLY : fa => fa_com_default, &
216 USE lfi_precision
217 IMPLICIT NONE
218 ! Arguments
219 INTEGER (KIND=JPLIKB) KREP ! OUT
220 INTEGER (KIND=JPLIKB) KNUMER ! IN
221 CHARACTER (LEN=*) CDSTTU ! IN
222 
223 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
224 
225 CALL fairme_fort &
226 & (fa, krep, knumer, cdsttu)
227 
228 END SUBROUTINE fairme64
229 
230 SUBROUTINE fairme &
231 & (krep, knumer, cdsttu)
232 USE fa_mod, ONLY : fa => fa_com_default, &
235 USE lfi_precision
236 IMPLICIT NONE
237 ! Arguments
238 INTEGER (KIND=JPLIKM) KREP ! OUT
239 INTEGER (KIND=JPLIKM) KNUMER ! IN
240 CHARACTER (LEN=*) CDSTTU ! IN
241 
242 IF (.NOT. fa_com_default_init) CALL new_fa_default ()
243 
244 CALL fairme_mt &
245 & (fa, krep, knumer, cdsttu)
246 
247 END SUBROUTINE fairme
248 
249 SUBROUTINE fairme_mt &
250 & (fa, krep, knumer, cdsttu)
251 USE fa_mod, ONLY : fa_com
252 USE lfi_precision
253 IMPLICIT NONE
254 ! Arguments
255 type(fa_com) fa ! INOUT
256 INTEGER (KIND=JPLIKM) KREP ! OUT
257 INTEGER (KIND=JPLIKM) KNUMER ! IN
258 CHARACTER (LEN=*) CDSTTU ! IN
259 ! Local integers
260 INTEGER (KIND=JPLIKB) IREP ! OUT
261 INTEGER (KIND=JPLIKB) INUMER ! IN
262 ! Convert arguments
263 
264 inumer = int( knumer, jplikb)
265 
266 CALL fairme_fort &
267 & (fa, irep, inumer, cdsttu)
268 
269 krep = int( irep, jplikm)
270 
271 END SUBROUTINE fairme_mt
272 
273 !INTF KREP OUT
274 !INTF KNUMER IN
275 !INTF CDSTTU IN
subroutine factui_fort(FA, KREP, KRANGC)
Definition: factui.F90:5
subroutine fairme(KREP, KNUMER, CDSTTU)
Definition: fairme.F90:232
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 fairme_mt(FA, KREP, KNUMER, CDSTTU)
Definition: fairme.F90:251
subroutine lfiver_fort(LFI, PVEROU, CDSENS)
Definition: lfiver.F90:6
integer, parameter jprb
Definition: parkind1.F90:32
subroutine fairme64(KREP, KNUMER, CDSTTU)
Definition: fairme.F90:213
logical lhook
Definition: yomhook.F90:15
integer, parameter jplikm
type(fa_com), target, save fa_com_default
Definition: fa_mod.F90:476
subroutine lfifer_fort(LFI, KREP, KNUMER, CDSTTC)
Definition: lfifer.F90:7
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
subroutine fairme_fort(FA, KREP, KNUMER, CDSTTU)
Definition: fairme.F90:5
subroutine fanumu_fort(FA, KNUMER, KRANG)
Definition: fanumu.F90:5
integer(kind=jplikb), parameter jpniil
Definition: fa_mod.F90:31
subroutine free_fichier(FI)
Definition: fa_mod.F90:634