SURFEX v8.1
General documentation of Surfex
lfimod.F90
Go to the documentation of this file.
1 MODULE lfimod
2 ! Jan-2011 P. Marguinaud Interface to thread-safe LFI
3 ! Sep-2012 P. Marguinaud Initialize data + DrHook
4 USE parkind1, ONLY : jpim, jprb, jpib, jpia
5 USE yomhook, ONLY : lhook, dr_hook
7 IMPLICIT NONE
8 !
9 !----- DESCRIPTION DES "PARAMETER" DU LOGICIEL DE FICHIERS INDEXES -----
10 !----- (et des variables logiques a charger absolument partout ) -----
11 !
12 ! JPNBIM = NOMBRE DE BITS PAR MOT MACHINE
13 ! JPNBIC = NOMBRE DE BITS PAR CARACTERE
14 ! JPNCMO = NOMBRE DE CARACTERES PAR MOT MACHINE
15 !
16 ! JPNCPN = NOMBRE MAXI. POSSIBLE DE CARACTERES PAR NOM D'ARTICLE
17 ! JPLARD = LONGUEUR D'ARTICLE "PHYSIQUE" elementaire des Fichiers
18 ! ( exprimee en mots, DOIT ETRE PAIRE, SUPERIEURE OU EGALE
19 ! a JPLDOC, JPLARD*JPNCMO DOIT ETRE MULTIPLE DE JPNCPN )
20 ! JPLARC = Longueur d'article "physique" exprimee en caracteres
21 ! JPRECL = PARAMETRE "RECL" de base POUR "OPEN" DES FICHIERS
22 ! JPNXFI = NOMBRE MAXIMUM DE FICHIERS INDEXES OUVERTS SIMULTANEMENT
23 ! (1 fichier de "multiplicite" N comptant comme N fichiers)
24 ! JPFACX = FACteur multiplicateur maXimum entre longueur d'article
25 ! physique effective et elementaire ( de 1 a JPNXFI )
26 ! JPXUFM = Nombre maXimum d'Unites logiques a Facteur Mul. predefini
27 ! JPNPIA = NOMBRE DE *PAIRES* DE "PAGES D'INDEX" EN MEMOIRE
28 ! *PREALLOUEES* PAR UNITE LOGIQUE ( AU MOINS *4* )
29 ! JPNXPI = NOMBRE TOTAL DE *PAIRES* DE "PAGES D'INDEX" EN MEMOIRE
30 ! ALLOUABLES ( DOIT ETRE AU MOINS EGAL A JPNPIA*JPNXFI )
31 ! JPNPIS = NOMBRE DE *PAIRES* DE "PAGES D'INDEX" NON PREALLOUEES
32 ! JPNXNA = NOMBRE MAXI. DE NOMS D'ARTICLES PAR PAGE/ARTICLE D'INDEX
33 ! JPNBLP = NOMBRE MAXI. DE COUPLES (LONGUEUR/POSITION)" " "
34 ! JPNAPP = NOMBRE MAXI. UTILE DE NOMS D'ARTICLES PAR PAGE/AR D'INDEX
35 ! JPLDOC = LONGUEUR (MOTS) DE LA PARTIE DOCUMENTAIRE DU 1ER ARTICLE
36 ! JPNPDF = NOMBRE DE PAGES DE DONNEES PAR FICHIER OUVERT ( >= 2 )
37 ! JPNXPR = NOMBRE MAXIMUM DE PAIRES D'ARTICLES D'INDEX RESERVABLES
38 ! JPNIL = CODE DE "VALEUR ABSENTE" POUR CERTAINES TABLES D'ENTIERS.
39 ! JPNMPN = NOMBRE DE MOTS NECESSAIRE AU STOCKAGE D'UN NOM D'ARTICLE
40 ! JPNAPX = JPNAPP*JPFACX
41 ! JPLARX = JPLARD*JPFACX = longueur d'article physique maximale
42 ! JPLFTX = Longueur maximale traitable des noms de fichiers.
43 ! JPLFIX = " " imprimable " " " " .
44 ! JPLSPX = " " des noms des sous-programmes du logiciel.
45 ! JPLSTX = " " des valeurs du "STATUS" FORTRAN (open/close).
46 ! JPCFMX = Nombre maximum de ConFigurations pour iMport/eXport.
47 ! JPIMEX = " " de fichiers imp/exportables "simultanement".
48 ! JPDEXP = Dimension tableau Descripteurs EXPlicites d'imp/export.
49 ! JPDIMP = " " " IMPlicites " " " .
50 ! JPXDAM = Nombre maXimum noms D'Articles d'imp/export en Memoire.
51 ! JPXCIE = " " de Caracteres par nom pour Import/Export.
52 ! JPXMET = " " " " " " avec METacaracteres.
53 ! JPXCCF = " " " " des noms de ConFig. imp/exp.
54 ! JPTYMX = " de TYpes de variables valides pour Import/Export.
55 !
56 !
57 !
58  INTEGER (KIND=JPLIKB), PARAMETER :: jplstx = 7
59  INTEGER (KIND=JPLIKB), PARAMETER :: jpnbst = 4
60  INTEGER (KIND=JPLIKB), PARAMETER :: jpncpn = 16
61  INTEGER (KIND=JPLIKB), PARAMETER :: jplftx = 512
62  INTEGER (KIND=JPLIKB), PARAMETER :: jpxccf = 16
63  INTEGER (KIND=JPLIKB), PARAMETER :: jpxmet = 2 * jpncpn
64  INTEGER (KIND=JPLIKB), PARAMETER :: jptymx = 5
65  INTEGER (KIND=JPLIKB), PARAMETER :: jplspx = 6
66 
67 !
68 !---------- VARIABLES LOGIQUES A CHARGER ABSOLUMENT PARTOUT ------------
69 !
70 ! LMISOP = VRAI SI ON DOIT TRAVAILLER EN MODE MISE AU POINT LOGICIEL
71 ! LFRANC = Vrai/Faux si la messagerie doit etre en francais/anglais
72 !
73 !
74 !-------- DESCRIPTION DE LA PARTIE DOCUMENTAIRE DU 1ER ARTICLE ---------
75 !
76 ! MOT 1 ==> LONGUEUR "PHYSIQUE" Effective DES ARTICLES (EN MOTS)
77 ! MOT 2 ==> LONGUEUR MAXIMUM DES NOMS D'ARTICLES (CARACTERES)
78 ! MOT 3 ==> "DRAPEAU" SIGNALANT SI LE FICHIER A BIEN ETE FERME
79 ! APRES LA DERNIERE MODIFICATION
80 ! MOT 4 ==> LONGUEUR DE LA PARTIE DOCUMENTAIRE DU FICHIER
81 ! MOT 5 ==> NOMBRE D'ARTICLES "PHYSIQUES" DANS LE FICHIER
82 ! MOT 6 ==> " " LOGIQUES " " "
83 ! (Y COMPRIS LES "TROUS" CREES PAR LES REECRITURES
84 ! D'ARTICLES PLUS LONGUES QUE PRECEDEMMENT, ET N'AYANT
85 ! PAS ENCORE PU ETRE REUTILISES, COMPTES DANS LE MOT 21)
86 ! MOT 7 ==> LONGUEUR MINI. DES ARTICLES LOGIQUES DE DONNEES (MOTS)
87 ! MOT 8 ==> " MAXI. " " " " " "
88 ! MOT 9 ==> " TOTALE " " " " " "
89 ! MOT 10 ==> NOMBRE DE REECRITURES SUR PLACE (VRAIES)
90 ! MOT 11 ==> " " " PLUS COURTES
91 ! MOT 12 ==> " " " " LONGUES
92 ! MOT 13 ==> NOMBRE MAXIMUM D'ARTICLES PAR PAGE OU ARTICLE D'INDEX
93 ! MOT 14 ==> DATE DE LA CREATION DU FICHIER (1ERE OUVERTURE)
94 ! MOT 15 ==> HEURE " " " " " ( " " )
95 ! MOT 16 ==> DATE DE LA DERNIERE MODIFICATION GARANTIE (FERMETURE)
96 ! MOT 17 ==> HEURE " " " " " ( " )
97 ! MOT 18 ==> DATE DE LA 1ERE MODIFICATION PAS FORCEMENT GARANTIE
98 ! MOT 19 ==> HEURE " " " " " " "
99 ! (LES MODIFICATIONS NE SONT GARANTIES QUE SI LE MOT 4 VAUT ZERO)
100 ! MOT 20 ==> NOMBRE DE PAIRES D'ARTICLES D'INDEX PRERESERVES .
101 ! MOT 21 ==> NOMBRE DE "TROUS" CORRESP. A DES REECRITURES + LONGUES
102 ! ( AVANT OUVERTURE )
103 ! MOT 22 ==> NUMERO D'ARTICLE MAXI. DES ARTICLES PHYSIQ. DE DONNEES
104 !
105 !------ "PARAMETER" DECRIVANT LES POSITIONS DES ENTITES CI-DESSUS ------
106 !
107 !
108 !
109 !
110 !--- DESCRIPTIF DES TABLES CONCERNANT LES (PAIRES DE) PAGES D'INDEX ----
111 ! ( ALIAS "P.P.I." )
112 !
113 ! CNOMAR = TABLE DES PAGES D'INDEX DE TYPE "NOMS D'ARTICLES"
114 ! MLGPOS = TABLE DES PAGES D'INDEX DE TYPE "LONGUEUR/POSITION"
115 ! MRGPIF = TABLE DES RANGS DES P.P.I. DANS LEUR FICHIER RESPECTIF
116 ! MCOPIF = TABLE DE CORRESPONDANCE PAGES D'INDEX/UNITES LOGIQUES
117 ! MRGPIM = TABLE DES RANGS EN MEMOIRE DES P.P.I. AFFECTEES
118 ! ( DANS *MCOPIF,MRGPIF,CNOMAR,MLGPOS,LECRPI,LPHASP* )
119 ! LECRPI = VRAI SI LA PAGE D'INDEX CORRESP. DOIT ETRE (RE)ECRITE
120 ! (.,1) ==> PAGE "NOM", (.,2) ==> PAGE "LONGUEUR/POSITION"
121 ! LPHASP = VRAI SI LA PAGE D'INDEX "LONG/POS" EST PHASEE EN MEMOIRE
122 ! AVEC LA PAGE D'INDEX "NOM" CORRESPONDANTE
123 !
124 !---------------- VARIABLES "SIMPLES" GLOBALES -------------------------
125 !
126 ! NBFIOU = Nombre d'Unites Logiques ouvertes
127 ! NFACTM = Somme des Facteurs Multiplicatifs utilises
128 ! NIMESG = NIVEAU *GLOBAL* DE LA MESSAGERIE
129 ! NERFAG = NIVEAU DE FILTRAGE GLOBAL DES ERREURS FATALES
130 ! NISTAG = NIVEAU D'IMPRESSION GLOBAL DES STATISTIQUES
131 ! NPISAF = NBRE DE PAIRES DE PAGES D'INDEX SUPPLEMENTAIRES AFFECTEES
132 ! LMULTI = VRAI SI ON DOIT TRAVAILLER EN MODE MULTI-TACHES
133 ! LTAMLG = OPTION PAR DEFAUT D'UTILISATION DE LA MEMOIRE TAMPON EN
134 ! LECTURE; VRAIE ==> UTILISATION MAXIMUM
135 ! LTAMEG = CF. CI-DESSUS, EN ECRITURE
136 ! VERGLA = VERROU GLOBAL (EN MULTI-TASKING)
137 ! NULOFM = Nombre d'Unites LOgiques a Facteur Multiplicat. predefini
138 ! CHINCO = Nom par defaut d'une variable qui devrait etre CHaracter
139 ! NUIMEX = Nombre d'Unites LOgiques en cours d'IMport/EXport
140 !
141 !--------- DESCRIPTIF DES ELEMENTS CONCERNANT UNE UNITE LOGIQUE --------
142 !
143 ! NUMIND = TABLE D'ADRESSAGE INDIRECT DANS LES TABLEAUX CI-DESSOUS
144 ! NUMERO = NUMERO DE L'UNITE LOGIQUE
145 ! MFACTM = FACteur Multiplicatif de la longueur physique elementaire
146 ! CNOMFI = NOM eventuel du FIchier associe a l'unite logique
147 ! CNOMSY = Idem pour le systeme, ou a defaut pour l'utilisateur.
148 ! NLNOMF = LONGUEUR (CARACTERES) DU NOM EVENTUEL
149 ! NLNOMS = Longueur (en caracteres) du Nom SYSTEME eventuel
150 ! NDEROP = CODE DE LA DERNIERE ACTION EFFECTUEE
151 ! CSTAOP = 'STATUS' DE L'OUVERTURE
152 ! LNOUFI = VRAI SI LE FICHIER EST NOUVEAU (AU SENS DU LOGICIEL)
153 ! LMODIF = " " " " A ETE MODIFIE DEPUIS L'OUVERTURE
154 ! NDERCO = DERNIER CODE-REPONSE (CORRESPONDANT A LA DERNIERE ACTION)
155 ! MTAMPD = PAGES DE DONNEES "TAMPON"
156 ! NUMAPD = NUMERO D'ARTICLE PHYSIQUE CORRESPONDANT A CES PAGES
157 ! LECRPD = VRAI SI LA PAGE DE DONNEES CORRESP. DOIT ETRE ECRITE
158 ! NLONPD = LONGUEUR DE PAGE DE DONNEES REELLEMENT REMPLIE
159 ! NDERPD = NUMERO DE LA DERNIERE PAGE DE DONNEES UTILISEE
160 ! NPODPI = RANG DE LA DERNIERE PAGE D'INDEX DANS LA TABLE *MRGPIM*
161 ! NALDPI = NOMBRE D'ARTICLES LOGIQUES DANS LA DERNIERE PAGE D'INDEX
162 ! NBLECT = " DE LECTURES EFFECTUEES DEPUIS L'OUVERTURE
163 ! NBNECR = " " NOUVELLES ECRITURES " " "
164 ! NREESP = " " "VRAIES" REECRITURES SUR PLACE " "
165 ! NREECO = " " REECRITURES PLUS COURTES " "
166 ! NREELO = " " " PLUS LONGUES " "
167 ! NBRENO = " " FOIS OU ON A RENOMME UN ARTICLE " "
168 ! NBSUPP = " " " " " " " SUPPRIME " " " "
169 ! NBTROU = " " TROUS D'INDEX CREES " "
170 ! NIVMES = NIVEAU DE LA MESSAGERIE
171 ! LERFAT = VRAI SI TOUTE ERREUR DOIT ETRE FATALE
172 ! LISTAT = OPTION D'IMPRESSION DES STATISTIQUES ( A LA FERMETURE )
173 ! VERRUE = VERROU DE L'UNITE LOGIQUE (EN MODE MULTI-TASKING)
174 ! NPPIMM = NBRE DE PAIRES DE PAGES D'INDEX EN MEMOIRE
175 ! MDES1D = TABLE CONTENANT LE 1ER ARTICLE ("DESCRIPTIF")
176 ! NTRULZ = NOMBRE DE TROUS D'INDEX DE LONGUEUR NULLE
177 ! NRFPTZ = RANG PREMIERE ARTICLE AYANT LA CARACTERISTIQUE CI-DESSUS
178 ! NRFDTZ = " DERNIER " " " " "
179 ! NBREAD = NOMBRE DE "READ" FORTRAN REELLEMENT EXECUTES (DEPUIS L'
180 ! NBWRIT = " "WRITE" " " " OUVERTURE)
181 ! NBMOLU = NOMBRE DE MOTS UTILISATEUR LUS CORRECTEMENT (DEPUIS L'
182 ! NBMOEC = " " " " ECRITS " OUVERTURE)
183 ! LTAMPL = OPTION D'UTILISATION MAXI DE LA MEMOIRE TAMPON EN LECTURE
184 ! LTAMPE = " " " " " " " " " ECRITURE
185 ! NDERGF = RANG DANS LE FICHIER DU DERNIER ARTICLE LOGIQUE LU
186 ! ou dont on a demande les caracteristiques (LFICAS/LFICAP)
187 ! CNDERA = NOM de ce dernier article logique de donnees
188 ! NSUIVF = RANG DANS LE FICHIER DU PROCHAIN ARTICLE LOGIQUE A LIRE
189 ! "SEQUENTIELLEMENT"
190 ! NPRECF = RANG DANS LE FICHIER DU PROCHAIN ARTICLE LOGIQUE
191 ! "PRECEDENT" A LIRE
192 ! LMIMAL = VRAI SI ON DOIT RECALCULER LES LONGUEURS MINI. ET MAXI.
193 ! DES ARTICLES LOGIQUES DE DONNEES
194 ! NUMAPH = NUMero d'Article PHysique (pour messages d'erreur E/S).
195 ! NEXPOR = Rang eventuel (d'EXPORt) dans les tables MNUIEX,NDIMPL,
196 ! NIMPOR = " " (d'IMPORt) NDEXPL,NREXPL,CNEXPL,NIMPEX...
197 !
198 !------------------------ VARIABLES DIVERSES ---------------------------
199 !
200 ! MULOFM = Table des Unites LOgiques avec Facteur Multip. predefini
201 ! MFACTU = " " FActeurs mUltiplicatifs associes a ces Unites
202 ! MNUIEX = " " Numeros d'Unites logiques en Import/EXport
203 ! NINIEX = " d'adressage INdirect dans MNUIEX
204 ! NDIMPL = Descripteurs IMPLicites d'import/export en memoire
205 ! NDEXPL = " EXPLicites " " / " " "
206 ! CNIMPL = Profil des articles a description IMPLicite
207 ! NAEXPL = Nombre d'articles decrits EXPLicitement
208 ! CNEXPL = Noms des articles decrits dans NDEXPL
209 ! NREXPL = Rang " " " " NDEXPL
210 ! NIMPEX = Numero d'unite logique associee a l'IMPort ou l'EXport.
211 ! NUTRAV = " " " " de TRAVail pour import ou export.
212 ! NLAPFD = Longueur d'Article Physique du fichier d'export/import.
213 ! NXCNLD = Nb.maX. Caracteres/Nom d'article du logiciel LFI Distant.
214 ! NRCFMX = Rang de la config. Imp/eXport dans CFGMXD, NBMOSD, NBCASD
215 ! CFGMXD = ConFiGuration pour iMport/eXport des systemes Distants.
216 ! NBMOSD = Nombre de Bits par MOt des systemes Distants.
217 ! NBCASD = " " " " CAractere " " " .
218 ! CTYPMX = Liste des types de variables valides pour Import/eXport.
219 !
220  TYPE lficrw
221  sequence
222 ! C file pointer
223  INTEGER (KIND=JPIA) :: n_c_fpdesc = 0
224 ! File offset (start from zero)
225  INTEGER (KIND=JPIB) :: n_c_offset = 0
226 ! File requires byte-swapping
227  LOGICAL :: l_c_btswap = .false.
228 ! File name
229  CHARACTER*(JPLFTX), POINTER :: cnomfi => null ()
230  END TYPE lficrw
231 
232  TYPE lficom
233  sequence
234  CHARACTER (LEN=8) :: cmagic = "LFI_FORT"
235  INTEGER (KIND=JPIA) :: ilficc = 0_jpia
236 ! lficom0
237  INTEGER (KIND=JPLIKB) jpnbim, jpnbic, jpncpn, jplard
238  INTEGER (KIND=JPLIKB) jpnpdf, jpxufm, jpnxfi
239  INTEGER (KIND=JPLIKB) jpnpia, jpnxpi, jpnxpr, jpldoc
240  INTEGER (KIND=JPLIKB) jpnil, jpncmo, jplarc
241  INTEGER (KIND=JPLIKB) jpxmet, jprecl, jpfacx, jplftx
242  INTEGER (KIND=JPLIKB) jplfix, jplspx, jplstx
243  INTEGER (KIND=JPLIKB) jpimex, jpdexp, jpdimp, jpxdam
244  INTEGER (KIND=JPLIKB) jpxcie, jpcfmx, jpxccf
245  INTEGER (KIND=JPLIKB) jpnxna, jpnblp, jpnapp, jpnpis
246  INTEGER (KIND=JPLIKB) jpnapx, jpnmpn, jplarx
247  INTEGER (KIND=JPLIKB) jptymx, jpnbst
248  LOGICAL lmisop, lfranc
249 ! lficom1
250  INTEGER (KIND=JPLIKB) jplpar, jplmna, jpfeam, jplldo
251  INTEGER (KIND=JPLIKB) jpnaph, jpnalo, jplnal
252  INTEGER (KIND=JPLIKB) jplxal, jpltal, jpnres, jpnrec
253  INTEGER (KIND=JPLIKB) jpnrel, jpxapi, jpdcre
254  INTEGER (KIND=JPLIKB) jphcre, jpddmg, jphdmg, jpdmng
255  INTEGER (KIND=JPLIKB) jphmng, jpnpir, jpntru
256  INTEGER (KIND=JPLIKB) jpaxpd
257  CHARACTER*(JPNCPN), POINTER :: cnomar (:) => null ()
258  CHARACTER*(JPNCPN), POINTER :: cndera (:) => null ()
259  CHARACTER*(JPNCPN) chinco
260  CHARACTER*(JPLFTX), POINTER :: cnomfi (:) => null ()
261  CHARACTER*(JPLFTX), POINTER :: cnomsy (:) => null ()
262  CHARACTER*(JPLSTX), POINTER :: cstaop (:) => null ()
263  CHARACTER*(JPNCPN), POINTER :: cnexpl (:,:) => null ()
264  CHARACTER*(JPTYMX) ctypmx
265  CHARACTER*(JPXMET), POINTER :: cnimpl (:) => null ()
266  CHARACTER*(JPXCCF), POINTER :: cfgmxd (:) => null ()
267 !
268  INTEGER (KIND=JPLIKB) nbfiou, nfactm, nimesg
269  INTEGER (KIND=JPLIKB) nerfag, nistag, npisaf, nulofm
270  INTEGER (KIND=JPLIKB), POINTER :: mlgpos (:) => null ()
271  INTEGER (KIND=JPLIKB), POINTER :: mtampd (:) => null ()
272  INTEGER (KIND=JPLIKB), POINTER :: mdes1d (:) => null ()
273  INTEGER (KIND=JPLIKB), POINTER :: mrgpim (:,:) => null ()
274  INTEGER (KIND=JPLIKB), POINTER :: nderpd (:) => null ()
275  INTEGER (KIND=JPLIKB), POINTER :: mcopif (:) => null ()
276  INTEGER (KIND=JPLIKB), POINTER :: mrgpif (:) => null ()
277  INTEGER (KIND=JPLIKB), POINTER :: numero (:) => null ()
278  INTEGER (KIND=JPLIKB), POINTER :: nlnomf (:) => null ()
279  INTEGER (KIND=JPLIKB), POINTER :: nlnoms (:) => null ()
280  INTEGER (KIND=JPLIKB), POINTER :: nderco (:) => null ()
281  INTEGER (KIND=JPLIKB), POINTER :: npodpi (:) => null ()
282  INTEGER (KIND=JPLIKB), POINTER :: numaph (:) => null ()
283  INTEGER (KIND=JPLIKB), POINTER :: naldpi (:) => null ()
284  INTEGER (KIND=JPLIKB), POINTER :: nblect (:) => null ()
285  INTEGER (KIND=JPLIKB), POINTER :: nreesp (:) => null ()
286  INTEGER (KIND=JPLIKB), POINTER :: nreeco (:) => null ()
287  INTEGER (KIND=JPLIKB), POINTER :: nbnecr (:) => null ()
288  INTEGER (KIND=JPLIKB), POINTER :: nreelo (:) => null ()
289  INTEGER (KIND=JPLIKB), POINTER :: nivmes (:) => null ()
290  INTEGER (KIND=JPLIKB), POINTER :: nderop (:) => null ()
291  INTEGER (KIND=JPLIKB), POINTER :: numapd (:,:) => null ()
292  INTEGER (KIND=JPLIKB), POINTER :: nlonpd (:,:) => null ()
293  INTEGER (KIND=JPLIKB), POINTER :: nppimm (:) => null ()
294  INTEGER (KIND=JPLIKB), POINTER :: nrfdtz (:) => null ()
295  INTEGER (KIND=JPLIKB), POINTER :: ntrulz (:) => null ()
296  INTEGER (KIND=JPLIKB), POINTER :: nrfptz (:) => null ()
297  INTEGER (KIND=JPLIKB), POINTER :: nbtrou (:) => null ()
298  INTEGER (KIND=JPLIKB), POINTER :: numind (:) => null ()
299  INTEGER (KIND=JPLIKB), POINTER :: nbwrit (:) => null ()
300  INTEGER (KIND=JPLIKB), POINTER :: nbmolu (:) => null ()
301  INTEGER (KIND=JPLIKB), POINTER :: nbread (:) => null ()
302  INTEGER (KIND=JPLIKB), POINTER :: nbmoec (:) => null ()
303  INTEGER (KIND=JPLIKB), POINTER :: ndergf (:) => null ()
304  INTEGER (KIND=JPLIKB), POINTER :: nsuivf (:) => null ()
305  INTEGER (KIND=JPLIKB), POINTER :: nbreno (:) => null ()
306  INTEGER (KIND=JPLIKB), POINTER :: nbsupp (:) => null ()
307  INTEGER (KIND=JPLIKB), POINTER :: nprecf (:) => null ()
308  INTEGER (KIND=JPLIKB), POINTER :: mfactm (:) => null ()
309  INTEGER (KIND=JPLIKB), POINTER :: mulofm (:) => null ()
310  INTEGER (KIND=JPLIKB), POINTER :: mfactu (:) => null ()
311  INTEGER (KIND=JPLIKB), POINTER :: nimpex (:) => null ()
312  INTEGER (KIND=JPLIKB), POINTER :: nutrav (:) => null ()
313  INTEGER (KIND=JPLIKB), POINTER :: nbcasd (:) => null ()
314  INTEGER (KIND=JPLIKB), POINTER :: nlapfd (:) => null ()
315  INTEGER (KIND=JPLIKB), POINTER :: mnuiex (:) => null ()
316  INTEGER (KIND=JPLIKB), POINTER :: niniex (:) => null ()
317  INTEGER (KIND=JPLIKB), POINTER :: nbmosd (:) => null ()
318  INTEGER (KIND=JPLIKB), POINTER :: ndexpl (:,:) => null ()
319  INTEGER (KIND=JPLIKB), POINTER :: ndimpl (:,:) => null ()
320  INTEGER (KIND=JPLIKB), POINTER :: nxcnld (:) => null ()
321  INTEGER (KIND=JPLIKB), POINTER :: naexpl (:) => null ()
322  INTEGER (KIND=JPLIKB), POINTER :: nrcfmx (:) => null ()
323  INTEGER (KIND=JPLIKB), POINTER :: nexpor (:) => null ()
324  INTEGER (KIND=JPLIKB), POINTER :: nimpor (:) => null ()
325  INTEGER (KIND=JPLIKB) nuimex
326  INTEGER (KIND=JPLIKB), POINTER :: nrexpl (:,:) => null ()
327 !
328  REAL (KIND=JPDBLR), POINTER :: verrue (:) => null ()
329  REAL (KIND=JPDBLR) vergla
330 !
331  LOGICAL lmulti, ltamlg, ltameg
332  LOGICAL, POINTER :: lecrpi (:,:) => null ()
333  LOGICAL, POINTER :: ltampl (:) => null ()
334  LOGICAL, POINTER :: ltampe (:) => null ()
335  LOGICAL, POINTER :: lmodif (:) => null ()
336  LOGICAL, POINTER :: lnoufi (:) => null ()
337  LOGICAL, POINTER :: lerfat (:) => null ()
338  LOGICAL, POINTER :: listat (:) => null ()
339  LOGICAL, POINTER :: lphasp (:) => null ()
340  LOGICAL, POINTER :: lecrpd (:,:) => null ()
341  LOGICAL, POINTER :: lmimal (:) => null ()
342 
343 ! subroutine saved variables
344  LOGICAL :: lficfg_llprea = .true.
345  CHARACTER (LEN=10) :: lfichi_clchif = '0123456789'
346  LOGICAL :: lfideb_llprea = .true.
347  LOGICAL :: lfifmd_llprea = .true.
348  LOGICAL :: lfifra_llprea = .true.
349  LOGICAL :: lfiini_llprea = .true., lfiini_lldefm = .false.
350  LOGICAL :: lfineg_llprea = .true.
351  LOGICAL :: lfinmg_llprea = .true.
352  LOGICAL :: lfinsg_llprea = .true.
353  LOGICAL :: lfinum_llprea = .true.
354  LOGICAL :: lfioeg_llprea = .true.
355  LOGICAL :: lfiofd_llprea = .true.
356  LOGICAL :: lfiomg_llprea = .true.
357  LOGICAL :: lfiosg_llprea = .true.
358  CHARACTER*(JPLSTX) :: lfiouv_clstex (jpnbst)
359 
360  INTEGER (KIND=JPLIKB) lfirac_jpdebn
361 
362  INTEGER (KIND=JPLIKB) :: nulout = 0
363  INTEGER (KIND=JPLIKB) :: jplmes = 1024
364 
365  type(lficrw), POINTER :: ylfic(:) => null()
366 
367  END TYPE lficom
368 
369 
370  type(lficom), SAVE, TARGET :: lficom_default
371  LOGICAL, SAVE :: lficom_default_init = .false.
372 
373  CONTAINS
374 
375  SUBROUTINE new_lfi_default ()
376  INTEGER :: IERR
377  REAL (KIND=JPRB) :: ZHOOK_HANDLE
378 
379  IF (lhook) CALL dr_hook ('LFICOM:NEW_LFI_DEFAULT',0,zhook_handle)
380 
381  IF (.NOT. lficom_default_init) THEN
382  CALL new_lfi (lficom_default, ierr)
383  lficom_default_init = .true.
384  ENDIF
385 
386  IF (lhook) CALL dr_hook ('LFICOM:NEW_LFI_DEFAULT',1,zhook_handle)
387 
388  END SUBROUTINE new_lfi_default
389 
390  SUBROUTINE new_lfi (LFI, KERR, KPNXFI, KPFACX)
391  type(lficom) :: lfi
392  INTEGER, INTENT(OUT) :: KERR
393  INTEGER, OPTIONAL, INTENT(IN) :: KPNXFI
394  INTEGER, OPTIONAL, INTENT(IN) :: KPFACX
395  REAL (KIND=JPRB) :: ZHOOK_HANDLE
396 
397  IF (lhook) CALL dr_hook ('LFICOM:NEW_LFI',0,zhook_handle)
398 
399  kerr = 0
400 
401  lfi%JPLSTX = jplstx
402  lfi%JPNBST = jpnbst
403  lfi%JPNCPN = jpncpn
404  lfi%JPLFTX = jplftx
405 
406  lfi%JPLARD=512
407  lfi%JPNPDF=20
408  lfi%JPXUFM=100
409  lfi%JPNPIA=4
410  lfi%JPNXPR=100
411 
412 
413 #ifdef HIGHRES
414  lfi%JPNXFI=300
415  lfi%JPFACX=120
416 #else
417  lfi%JPNXFI=50
418  lfi%JPFACX=20
419 #endif
420 
421 
422  IF (PRESENT (kpnxfi)) lfi%JPNXFI = int(kpnxfi, jplikb)
423  IF (PRESENT (kpfacx)) lfi%JPFACX = int(kpfacx, jplikb)
424 
425 !
426 ! Implementation-dependent symbolic constants (except for JPNCMO and
427 ! JPLARC definitions, which are there to have only one set of
428 ! "ifdef" in current header).
429 !
430 #if defined ( DEC )
431  lfi%JPNBIM=64
432  lfi%JPNBIC=8
433  lfi%JPNCMO=lfi%JPNBIM/lfi%JPNBIC
434  lfi%JPLARC=lfi%JPNCMO*lfi%JPLARD
435  lfi%JPRECL=2*lfi%JPLARD
436 #elif defined ( HPPA )
437  lfi%JPNBIM=32
438  lfi%JPNBIC=8
439  lfi%JPNCMO=lfi%JPNBIM/lfi%JPNBIC
440  lfi%JPLARC=lfi%JPNCMO*lfi%JPLARD
441  lfi%JPRECL=lfi%JPLARC
442 #else
443 ! Notice : record length should be in BYTES for the computer system
444  lfi%JPNBIM=64
445  lfi%JPNBIC=8
446  lfi%JPNCMO=lfi%JPNBIM/lfi%JPNBIC
447  lfi%JPLARC=lfi%JPNCMO*lfi%JPLARD
448  lfi%JPRECL=lfi%JPLARC
449 #endif
450 
451  lfi%JPLDOC=22
452  lfi%JPNIL=-999
453  lfi%JPXMET=jpxmet
454  lfi%JPCFMX=4
455  lfi%JPNXPI=lfi%JPNPIA*lfi%JPNXFI+2*lfi%JPFACX
456  lfi%JPXCIE=2*lfi%JPNCPN
457  lfi%JPLFIX=128
458  lfi%JPLSPX=jplspx
459  lfi%JPLSTX=7
460  lfi%JPTYMX=jptymx
461  lfi%JPIMEX=2
462  lfi%JPDEXP=10000
463  lfi%JPDIMP=1000
464  lfi%JPXDAM=1000
465  lfi%JPNXNA=(lfi%JPLARD*lfi%JPNCMO)/lfi%JPNCPN
466  lfi%JPNBLP=lfi%JPLARD/2
467  lfi%JPNAPP=(lfi%JPNBLP*(lfi%JPNXNA/lfi%JPNBLP)+lfi%JPNXNA* &
468  & (lfi%JPNBLP/lfi%JPNXNA))/(lfi%JPNXNA/ &
469  & lfi%JPNBLP+lfi%JPNBLP/lfi%JPNXNA)
470  lfi%JPXCCF=jpxccf
471  lfi%JPNPIS=lfi%JPNXPI-lfi%JPNPIA*lfi%JPNXFI
472  lfi%JPNAPX=lfi%JPNAPP*lfi%JPFACX
473  lfi%JPNMPN=1+(lfi%JPNCPN-1)/lfi%JPNCMO
474  lfi%JPLARX=lfi%JPLARD*lfi%JPFACX
475  lfi%JPLPAR=1
476  lfi%JPLMNA=2
477  lfi%JPFEAM=3
478  lfi%JPLLDO=4
479  lfi%JPNAPH=5
480  lfi%JPNALO=6
481  lfi%JPLNAL=7
482  lfi%JPLXAL=8
483  lfi%JPLTAL=9
484  lfi%JPNRES=10
485  lfi%JPNREC=11
486  lfi%JPNREL=12
487  lfi%JPXAPI=13
488  lfi%JPDCRE=14
489  lfi%JPHCRE=15
490  lfi%JPDDMG=16
491  lfi%JPHDMG=17
492  lfi%JPDMNG=18
493  lfi%JPHMNG=19
494  lfi%JPNPIR=20
495  lfi%JPNTRU=21
496  lfi%JPAXPD=22
497 
498  lfi%LFIRAC_JPDEBN=(lfi%JPNMPN*(2/lfi%JPNMPN)+2*(lfi%JPNMPN/2)) &
499  & /((lfi%JPNMPN/2)+(2/lfi%JPNMPN))
500 
501  lfi%LFIOUV_CLSTEX = ''
502  lfi%LFIOUV_CLSTEX(1) = 'OLD'
503  lfi%LFIOUV_CLSTEX(2) = 'NEW'
504  lfi%LFIOUV_CLSTEX(3) = 'UNKNOWN'
505  lfi%LFIOUV_CLSTEX(4) = 'SCRATCH'
506 
507  ALLOCATE (lfi%YLFIC (lfi%JPNXFI), &
508  & stat = kerr)
509  IF (kerr /= 0) GOTO 999
510 
511  ALLOCATE ( &
512  & lfi%CNOMAR (lfi%JPNXNA*lfi%JPNXPI), lfi%CNDERA (lfi%JPNXFI), &
513  & lfi%CNOMFI (lfi%JPNXFI), lfi%CNOMSY (lfi%JPNXFI), &
514  & lfi%CSTAOP (lfi%JPNXFI), lfi%CNEXPL (lfi%JPXDAM,lfi%JPIMEX), &
515  & lfi%CNIMPL (lfi%JPIMEX), lfi%CFGMXD (0:lfi%JPCFMX), &
516  & lfi%MLGPOS (lfi%JPLARD*lfi%JPNXPI), &
517  & lfi%MTAMPD (lfi%JPLARD*lfi%JPNPDF*lfi%JPNXFI), &
518  & lfi%MDES1D (lfi%JPLARD*lfi%JPNXFI), &
519  & lfi%MRGPIM (lfi%JPNPIA+lfi%JPNPIS,lfi%JPNXFI), &
520  & lfi%NDERPD (lfi%JPNXFI), lfi%MCOPIF (lfi%JPNXPI), &
521  & lfi%MRGPIF (lfi%JPNXPI), lfi%NLNOMS (lfi%JPNXFI), &
522  & lfi%NUMERO (lfi%JPNXFI), lfi%NLNOMF (lfi%JPNXFI), &
523  & lfi%NDERCO (lfi%JPNXFI), lfi%NPODPI (lfi%JPNXFI), &
524  & stat = kerr )
525  IF (kerr /= 0) GOTO 999
526 
527  lfi%CNOMAR = ''; lfi%CNDERA = ''; lfi%CNOMFI = '';
528  lfi%CNOMSY = ''; lfi%CSTAOP = ''; lfi%CNEXPL = '';
529  lfi%CNIMPL = ''; lfi%CFGMXD = ''; lfi%MLGPOS = 0;
530  lfi%MTAMPD = 0; lfi%MDES1D = 0; lfi%MRGPIM = 0;
531  lfi%NDERPD = 0; lfi%MCOPIF = 0; lfi%MRGPIF = 0;
532  lfi%NLNOMS = 0; lfi%NUMERO = 0; lfi%NLNOMF = 0;
533  lfi%NDERCO = 0; lfi%NPODPI = 0;
534 
535  ALLOCATE ( &
536  & lfi%NUMAPH (0:lfi%JPNXFI), lfi%NALDPI (lfi%JPNXFI), &
537  & lfi%NBLECT (lfi%JPNXFI), lfi%NBNECR (lfi%JPNXFI), &
538  & lfi%NREESP (lfi%JPNXFI), lfi%NREECO (lfi%JPNXFI), &
539  & lfi%NREELO (lfi%JPNXFI), lfi%NIVMES (0:lfi%JPNXFI), &
540  & lfi%NDEROP (lfi%JPNXFI), lfi%NPPIMM (lfi%JPNXFI), &
541  & lfi%NUMAPD (0:lfi%JPNPDF-1,lfi%JPNXFI), &
542  & lfi%NLONPD (0:lfi%JPNPDF-1,lfi%JPNXFI), lfi%NTRULZ (lfi%JPNXFI), &
543  & lfi%NRFPTZ (lfi%JPNXFI), lfi%NRFDTZ (lfi%JPNXFI), &
544  & lfi%NBTROU (lfi%JPNXFI), lfi%NUMIND (lfi%JPNXFI), &
545  & lfi%NBREAD (lfi%JPNXFI), lfi%NBWRIT (lfi%JPNXFI), &
546  & lfi%NBMOLU (lfi%JPNXFI), lfi%NBMOEC (lfi%JPNXFI), &
547  & stat = kerr )
548  IF (kerr /= 0) GOTO 999
549 
550  lfi%NUMAPH = 0; lfi%NALDPI = 0; lfi%NBLECT = 0;
551  lfi%NBNECR = 0; lfi%NREESP = 0; lfi%NREECO = 0;
552  lfi%NREELO = 0; lfi%NIVMES = 0; lfi%NDEROP = 0;
553  lfi%NPPIMM = 0; lfi%NUMAPD = 0; lfi%NLONPD = 0;
554  lfi%NTRULZ = 0; lfi%NRFPTZ = 0; lfi%NRFDTZ = 0;
555  lfi%NBTROU = 0; lfi%NUMIND = 0; lfi%NBREAD = 0;
556  lfi%NBWRIT = 0; lfi%NBMOLU = 0; lfi%NBMOEC = 0;
557 
558  ALLOCATE ( &
559  & lfi%NDERGF (lfi%JPNXFI), lfi%NSUIVF (lfi%JPNXFI), &
560  & lfi%NPRECF (lfi%JPNXFI), lfi%NBRENO (lfi%JPNXFI), &
561  & lfi%NBSUPP (lfi%JPNXFI), lfi%MFACTM (0:lfi%JPNXFI), &
562  & lfi%MULOFM (lfi%JPXUFM), lfi%MFACTU (0:lfi%JPXUFM), &
563  & lfi%NIMPEX (lfi%JPIMEX), lfi%NUTRAV (lfi%JPIMEX), &
564  & lfi%NBMOSD (0:lfi%JPCFMX), lfi%NBCASD (0:lfi%JPCFMX), &
565  & lfi%NLAPFD (lfi%JPIMEX), lfi%MNUIEX (lfi%JPIMEX), &
566  & lfi%NINIEX (lfi%JPIMEX), lfi%NDEXPL (lfi%JPDEXP,lfi%JPIMEX), &
567  & lfi%NDIMPL (lfi%JPDIMP,lfi%JPIMEX), lfi%NXCNLD (lfi%JPIMEX), &
568  & stat = kerr )
569  IF (kerr /= 0) GOTO 999
570 
571  lfi%NDERGF = 0; lfi%NSUIVF = 0; lfi%NPRECF = 0;
572  lfi%NBRENO = 0; lfi%NBSUPP = 0; lfi%MFACTM = 0;
573  lfi%MULOFM = 0; lfi%MFACTU = 0; lfi%NIMPEX = 0;
574  lfi%NUTRAV = 0; lfi%NBMOSD = 0; lfi%NBCASD = 0;
575  lfi%NLAPFD = 0; lfi%MNUIEX = 0; lfi%NINIEX = 0;
576  lfi%NDEXPL = 0; lfi%NDIMPL = 0; lfi%NXCNLD = 0;
577 
578  ALLOCATE ( &
579  & lfi%NAEXPL (lfi%JPIMEX), lfi%NEXPOR (lfi%JPNXFI), &
580  & lfi%NIMPOR (lfi%JPNXFI), lfi%NRCFMX (lfi%JPIMEX), &
581  & lfi%NREXPL (0:lfi%JPXDAM,lfi%JPIMEX), lfi%VERRUE (lfi%JPNXFI), &
582  & lfi%LECRPI (lfi%JPNXPI,2), lfi%LTAMPL (lfi%JPNXFI), &
583  & lfi%LTAMPE (lfi%JPNXFI), lfi%LMODIF (lfi%JPNXFI), &
584  & lfi%LNOUFI (lfi%JPNXFI), lfi%LERFAT (0:lfi%JPNXFI), &
585  & lfi%LISTAT (lfi%JPNXFI), lfi%LPHASP (lfi%JPNXPI), &
586  & lfi%LECRPD (0:lfi%JPNPDF-1,lfi%JPNXFI), lfi%LMIMAL (lfi%JPNXFI), &
587  & stat = kerr )
588  IF (kerr /= 0) GOTO 999
589 
590  lfi%NAEXPL = 0; lfi%NEXPOR = 0; lfi%NIMPOR = 0;
591  lfi%NRCFMX = 0; lfi%NREXPL = 0; lfi%VERRUE = 0.;
592  lfi%LECRPI = .false.; lfi%LTAMPL = .false.;
593  lfi%LTAMPE = .false.; lfi%LMODIF = .false.;
594  lfi%LNOUFI = .false.; lfi%LERFAT = .false.;
595  lfi%LISTAT = .false.; lfi%LPHASP = .false.;
596  lfi%LECRPD = .false.; lfi%LMIMAL = .false.;
597 
598  999 CONTINUE
599 
600  IF (lhook) CALL dr_hook ('LFICOM:NEW_LFI',1,zhook_handle)
601 
602  END SUBROUTINE new_lfi
603 
604  SUBROUTINE free_lfi (LFI, KERR)
605  type(lficom) :: lfi
606  INTEGER, INTENT(OUT) :: KERR
607  REAL (KIND=JPRB) :: ZHOOK_HANDLE
608 
609  IF (lhook) CALL dr_hook ('LFICOM:FREE_LFI',0,zhook_handle)
610 
611  kerr = 0
612 
613  DEALLOCATE (lfi%YLFIC, &
614  & stat = kerr)
615  IF (kerr .NE. 0) GOTO 999
616 
617  DEALLOCATE ( &
618  & lfi%CNOMAR, lfi%CNDERA, &
619  & lfi%CNOMFI, lfi%CNOMSY, &
620  & lfi%CSTAOP, lfi%CNEXPL, &
621  & lfi%CNIMPL, lfi%CFGMXD, &
622  & lfi%MLGPOS, &
623  & lfi%MTAMPD, &
624  & lfi%MDES1D, &
625  & lfi%MRGPIM, &
626  & lfi%NDERPD, lfi%MCOPIF, &
627  & lfi%MRGPIF, lfi%NLNOMS, &
628  & lfi%NUMERO, lfi%NLNOMF, &
629  & lfi%NDERCO, lfi%NPODPI, &
630  & stat = kerr )
631  IF (kerr .NE. 0) GOTO 999
632 
633  DEALLOCATE ( &
634  & lfi%NUMAPH, lfi%NALDPI, &
635  & lfi%NBLECT, lfi%NBNECR, &
636  & lfi%NREESP, lfi%NREECO, &
637  & lfi%NREELO, lfi%NIVMES, &
638  & lfi%NDEROP, lfi%NPPIMM, &
639  & lfi%NUMAPD, &
640  & lfi%NLONPD, lfi%NTRULZ, &
641  & lfi%NRFPTZ, lfi%NRFDTZ, &
642  & lfi%NBTROU, lfi%NUMIND, &
643  & lfi%NBREAD, lfi%NBWRIT, &
644  & lfi%NBMOLU, lfi%NBMOEC, &
645  & stat = kerr )
646  IF (kerr .NE. 0) GOTO 999
647 
648  DEALLOCATE ( &
649  & lfi%NDERGF, lfi%NSUIVF, &
650  & lfi%NPRECF, lfi%NBRENO, &
651  & lfi%NBSUPP, lfi%MFACTM, &
652  & lfi%MULOFM, lfi%MFACTU, &
653  & lfi%NIMPEX, lfi%NUTRAV, &
654  & lfi%NBMOSD, lfi%NBCASD, &
655  & lfi%NLAPFD, lfi%MNUIEX, &
656  & lfi%NINIEX, lfi%NDEXPL, &
657  & lfi%NDIMPL, lfi%NXCNLD, &
658  & stat = kerr )
659  IF (kerr .NE. 0) GOTO 999
660 
661  DEALLOCATE ( &
662  & lfi%NAEXPL, lfi%NEXPOR, &
663  & lfi%NIMPOR, lfi%NRCFMX, &
664  & lfi%NREXPL, lfi%VERRUE, &
665  & lfi%LECRPI, lfi%LTAMPL, &
666  & lfi%LTAMPE, lfi%LMODIF, &
667  & lfi%LNOUFI, lfi%LERFAT, &
668  & lfi%LISTAT, lfi%LPHASP, &
669  & lfi%LECRPD, lfi%LMIMAL, &
670  & stat = kerr )
671  IF (kerr .NE. 0) GOTO 999
672 
673  999 CONTINUE
674 
675  IF (lfi%ILFICC /= 0) CALL lfi_hndl_free (lfi)
676 
677  IF (lhook) CALL dr_hook ('LFICOM:FREE_LFI',1,zhook_handle)
678 
679  END SUBROUTINE free_lfi
680 
681 END MODULE lfimod
682 
683 
integer, parameter jplikb
integer(kind=jplikb), parameter jplspx
Definition: lfimod.F90:65
integer, parameter jpim
Definition: parkind1.F90:13
integer(kind=jplikb), parameter jpxccf
Definition: lfimod.F90:62
subroutine new_lfi_default()
Definition: lfimod.F90:376
subroutine new_lfi(LFI, KERR, KPNXFI, KPFACX)
Definition: lfimod.F90:391
integer(kind=jplikb), parameter jpnbst
Definition: lfimod.F90:59
integer(kind=jplikb), parameter jplstx
Definition: lfimod.F90:58
logical, save lficom_default_init
Definition: lfimod.F90:371
integer, parameter jprb
Definition: parkind1.F90:32
integer(kind=jplikb), parameter jpncpn
Definition: lfimod.F90:60
integer(kind=jplikb), parameter jplftx
Definition: lfimod.F90:61
integer, parameter jpia
Definition: parkind1.F90:19
type(lficom), target, save lficom_default
Definition: lfimod.F90:370
logical lhook
Definition: yomhook.F90:15
subroutine free_lfi(LFI, KERR)
Definition: lfimod.F90:605
integer, parameter jpib
Definition: parkind1.F90:14
Definition: lfimod.F90:1
integer(kind=jplikb), parameter jpxmet
Definition: lfimod.F90:63
integer(kind=jplikb), parameter jptymx
Definition: lfimod.F90:64