SURFEX v8.1
General documentation of Surfex
lfi_intf.c
Go to the documentation of this file.
1 /**** *lfi_intf.c* - Interface to different LFI libraries
2  *
3  * Author.
4  * -------
5  * Philippe Marguinaud *METEO-FRANCE*
6  * Original : 12-08-2013
7  *
8  * Description :
9  * When lfiouv is called a choice is made on which LFI library will handle this unit;
10  * all subsequent calls will probe all LFI libraries to check which one has opened this unit.
11  * This is the basic principle; some routines have no KNUMER argument; these routines
12  * set the general message level, etc... and have to be handled by the lfi_intf macro.
13  * However, some other routines set the "facteur multiplicatif" of unopened units and
14  * have to be handled in a special manner.
15  */
16 
17 #include <stdlib.h>
18 #include <stdio.h>
19 #include <string.h>
20 #include "lfi_args.h"
21 #include "lfi_hndl.h"
22 #include "lfi_verb.h"
23 #include "lfi_abor.h"
24 #include "lfi_grok.h"
25 #include "lfi_util.h"
26 
28 {
29  lfi_abor ("No handler was found for unit %lld\n", *KNUMER);
30 }
31 
32 static void fatal_error (const char * func, integer64 * KREP)
33 {
34  lfi_abor ("*** %s, KREP=%lld", func, *KREP);
35 }
36 
37 /* This macro handles functions with a KNUMER and a KREP argument */
38 
39 #define lfi_intf_knumer_krep(lfixxx, LFIXXX) \
40 void lfixxx##_mt64_ (LFIXXX##_ARGS_DECL) \
41 { \
42  lfi_hndl_t * lfi = lfi_hndl (LFI, KNUMER); \
43  if (lfi != NULL) \
44  { \
45  void * LFI = lfi->data; \
46  int verb = lfi->is_verb (lfi, KNUMER); \
47  int fatl = lfi->is_fatl (lfi, KNUMER); \
48  \
49  if (verb) \
50  lfi->cb_verb->lfixxx (0, lfi, LFIXXX##_ARGS_LIST); \
51  \
52  lfi->cb->lfixxx (LFIXXX##_ARGS_LIST); \
53  \
54  if (verb) \
55  lfi->cb_verb->lfixxx (1, lfi, LFIXXX##_ARGS_LIST); \
56  \
57  if ((*KREP != 0) && fatl) \
58  fatal_error (#LFIXXX, KREP); \
59  \
60  } \
61  else \
62  { \
63  missing_handler (KNUMER); \
64  } \
65 }
66 
67 /* This macro handles functions without a KNUMER and a KREP argument */
68 
69 #define lfi_intf(lfixxx, LFIXXX) \
70 void lfixxx##_mt64_ (LFIXXX##_ARGS_DECL) \
71 { \
72  lfi_hndl_t * lfi, * lfi_head = lfi_hndl_list (LFI); \
73  integer64 INIVAU, IULOUT; \
74  lfi_head->cb->lfiomg (LFI, &INIVAU, &IULOUT); \
75  for (lfi = lfi_head; lfi; lfi = lfi->next) \
76  { \
77  void * LFI = lfi->data; \
78  lfi->cb->lfixxx (LFIXXX##_ARGS_LIST); \
79  } \
80  if (INIVAU == 2) \
81  { \
82  lficb_verb.lfixxx (0, lfi_head, LFIXXX##_ARGS_LIST); \
83  lficb_verb.lfixxx (1, lfi_head, LFIXXX##_ARGS_LIST); \
84  } \
85 }
86 
87 /* This macro handles functions with a KNUMER argument, but without a KREP argument */
88 
89 #define lfi_intf_knumer(lfixxx, LFIXXX) \
90 void lfixxx##_mt64_ (LFIXXX##_ARGS_DECL) \
91 { \
92  lfi_hndl_t * lfi = lfi_hndl (LFI, KNUMER); \
93  if (lfi != NULL) \
94  { \
95  void * LFI = lfi->data; \
96  int verb = lfi->is_verb (lfi, KNUMER); \
97  \
98  if (verb) \
99  lfi->cb_verb->lfixxx (0, lfi, LFIXXX##_ARGS_LIST); \
100  \
101  lfi->cb->lfixxx (LFIXXX##_ARGS_LIST); \
102  \
103  if (verb) \
104  lfi->cb_verb->lfixxx (1, lfi, LFIXXX##_ARGS_LIST); \
105  \
106  } \
107  else \
108  { \
109  missing_handler (KNUMER); \
110  } \
111 }
112 
113 
114 
115 /* lfiouv has to be coded explicitely;
116  * the choice of the LFI library is made here
117  */
118 
119 void lfiouv_mt64_ (LFIOUV_ARGS_DECL)
120 {
121  lfi_hndl_t * lfi = lfi_hndl_list (LFI);
122  int verb;
123  int unum = lfi_unum (KNUMER);
124  lfi_grok_t lg;
125  lficb_verb_t * vcb = &lficb_verb;
126  LFI_CSTR (cstto, CDSTTO);
127 
128  if (istrue (*LDNOMM))
129  {
130  lg = lfi_grok (CDNOMF, CDNOMF_len);
131  }
132  else
133  {
134  character CLNOMF[32];
135  character_len CLNOMF_len = sprintf (CLNOMF, "fort.%lld", *KNUMER);
136  lg = lfi_grok (CLNOMF, CLNOMF_len);
137  }
138 
139  switch (lg)
140  {
141  case LFI_PURE:
142  break;
143  case LFI_ALTM:
144  unum = 2;
145  break;
146  case LFI_NONE:
147  if ((strcmp (cstto, "NEW") != 0) && (strcmp (cstto, "UNKNOWN") != 0))
148  {
149  *KREP = -9;
150  lfi = NULL;
151  goto done;
152  }
153  break;
154  case LFI_UNKN:
155  *KREP = -10;
156  lfi = NULL;
157  goto done;
158  }
159 
160 
161  if ((lg != LFI_NONE) && (strcmp (cstto, "OLD") != 0) && (strcmp (cstto, "UNKNOWN") != 0))
162  {
163  *KREP = -9;
164  lfi = NULL;
165  goto done;
166  }
167 
168  for (; unum; unum--)
169  lfi = lfi->next;
170 
171  LFI = lfi->data;
172  lfi->cb->lfiouv (LFIOUV_ARGS_LIST);
173 
174 done:
175 
176  if (lfi != NULL)
177  vcb = lfi->cb_verb;
178 
179  verb = (*KREP != 0) && (vcb != NULL);
180 
181  if (! verb)
182  verb = lfi->is_verb (lfi, KNUMER);
183 
184  if (verb)
185  {
186  vcb->lfiouv (0, lfi, LFIOUV_ARGS_LIST);
187  vcb->lfiouv (1, lfi, LFIOUV_ARGS_LIST);
188  }
189 
190  if ((*KREP != 0) && (istrue (*LDERFA)))
191  fatal_error ("LFIOUV", KREP);
192 
193 
194 }
195 
197 
199 
201 
203 
205 
207 
208 lfi_intf (lfiver, LFIVER)
209 
210 
211 /* lfiofm has to be coded explicitely, because it operates on possibly unopened units */
212 
213 void lfiofm_mt64_ (LFIOFM_ARGS_DECL)
214 {
215  lfi_hndl_t * lfi = lfi_hndl (LFI, KNUMER);
216  if (lfi != NULL)
217  {
218  void * LFI = lfi->data;
219  int verb = lfi->is_verb (lfi, KNUMER);
220 
221  int fatl = lfi->is_fatl (lfi, KNUMER);
222 
223 
224  if (verb)
225  lfi->cb_verb->lfiofm (0, lfi, LFIOFM_ARGS_LIST);
226 
227  lfi->cb->lfiofm (LFIOFM_ARGS_LIST);
228 
229  if (verb)
230  lfi->cb_verb->lfiofm (1, lfi, LFIOFM_ARGS_LIST);
231 
232  if ((*KREP != 0) && fatl)
233  fatal_error ("LFIOFM", KREP);
234 
235  }
236  else
237  {
238  lfi_hndl_t * lfi, * lfi_head = lfi_hndl_list (LFI);
239  for (lfi = lfi_head; lfi; lfi = lfi->next)
240  {
241  void * LFI = lfi->data;
242  lfi->cb->lfiofm (LFIOFM_ARGS_LIST);
243  }
244  lficb_verb.lfiofm (0, lfi_head, LFIOFM_ARGS_LIST);
245  lficb_verb.lfiofm (1, lfi_head, LFIOFM_ARGS_LIST);
246  }
247 }
248 
249 lfi_intf (lfineg, LFINEG)
250 
252 
253 lfi_intf (lfiosg, LFIOSG)
254 
255 lfi_intf_knumer (lfinum, LFINUM)
256 
258 
260 
261 lfi_intf (lfinmg, LFINMG)
262 
264 
265 lfi_intf (lfifra, LFIFRA)
266 
267 lfi_intf (lficfg, LFICFG)
268 
270 
272 
274 
275 lfi_intf (lfiini, LFIINI)
276 
278 
279 lfi_intf (lfioeg, LFIOEG)
280 
282 
283 lfi_intf (lfiofd, LFIOFD)
284 
286 
287 
288 /* lfiafm has to be coded explicitely, because it operates on unopened units */
289 
290 void lfiafm_mt64_ (LFIAFM_ARGS_DECL)
291 {
292  lfi_hndl_t * lfi = lfi_hndl (LFI, KNUMER);
293  if (lfi != NULL)
294  {
295  *KREP = -5;
296  }
297  else
298  {
299  lfi_hndl_t * lfi, * lfi_head = lfi_hndl_list (LFI);
300  for (lfi = lfi_head; lfi; lfi = lfi->next)
301  {
302  void * LFI = lfi->data;
303  lfi->cb->lfiafm (LFIAFM_ARGS_LIST);
304  }
305  lficb_verb.lfiafm (0, lfi_head, LFIAFM_ARGS_LIST);
306  lficb_verb.lfiafm (1, lfi_head, LFIAFM_ARGS_LIST);
307  }
308 }
309 
311 
313 
315 
317 
319 
321 
322 
323 /* lfisfm has to be coded explicitely, because it operates on unopened units */
324 
325 void lfisfm_mt64_ (LFISFM_ARGS_DECL)
326 {
327  lfi_hndl_t * lfi = lfi_hndl (LFI, KNUMER);
328  if (lfi != NULL)
329  {
330  *KREP = -5;
331  }
332  else
333  {
334  lfi_hndl_t * lfi, * lfi_head = lfi_hndl_list (LFI);
335  for (lfi = lfi_head; lfi; lfi = lfi->next)
336  {
337  void * LFI = lfi->data;
338  lfi->cb->lfisfm (LFISFM_ARGS_LIST);
339  }
340  lficb_verb.lfisfm (0, lfi_head, LFISFM_ARGS_LIST);
341  lficb_verb.lfisfm (1, lfi_head, LFISFM_ARGS_LIST);
342  }
343 }
344 
345 lfi_intf (lfinsg, LFINSG)
346 
347 lfi_intf (lfideb, LFIDEB)
348 
349 lfi_intf (lfiomg, LFIOMG)
350 
351 lfi_intf (lfifmd, LFIFMD)
352 
353 /* lfipro has to be coded explicitely, because it operates on unopened units */
354 
355 void lfipro_mt64_ (LFIPRO_ARGS_DECL)
356 {
357  lfi_hndl_t * lfi, * lfi_head = lfi_hndl_list (LFI);
358  *LDOPEN = fort_FALSE;
359  for (lfi = lfi_head; lfi; lfi = lfi->next)
360  {
361  if (lfi->is_open (lfi, KNUMER))
362  {
363  *LDOPEN = fort_TRUE;
364  break;
365  }
366  }
367 }
368 
subroutine lfiosf(KREP, KNUMER, LDIMST)
Definition: lfiosf.F90:106
subroutine lfiofd(KFACMD)
Definition: lfiofd.F90:79
subroutine lfipxf(KREP, KNUMER, KNUMEX, CDCFGX, KLAREX, KXCNEX, KFACEX, KNUTRA, CDNOMA, KLONG)
Definition: lfipxf.F90:509
int(* is_fatl)(struct lfi_hndl_t *, integer64 *)
Definition: lfi_hndl.h:26
void(* lfiouv)(int, struct lfi_hndl_t *, LFIOUV_ARGS_DECL)
Definition: lfi_verb.h:25
subroutine lfiren(KREP, KNUMER, CDNOM1, CDNOM2)
Definition: lfiren.F90:334
subroutine lfilap(KREP, KNUMER, CDNOMA, KTAB, KLONG)
Definition: lfilap.F90:290
subroutine lfista(KREP, KNUMER)
Definition: lfista.F90:120
subroutine lfideb(LDEBUG)
Definition: lfideb.F90:78
subroutine lfifer(KREP, KNUMER, CDSTTC)
Definition: lfifer.F90:1180
subroutine lficas(KREP, KNUMER, CDNOMA, KLONG, KPOSEX, LDAVAN)
Definition: lficas.F90:252
subroutine lfifmd(KFACMD)
Definition: lfifmd.F90:138
subroutine lfiecr(KREP, KNUMER, CDNOMA, KTAB, KLONG)
Definition: lfiecr.F90:524
INTERFACE SUBROUTINE FACILO && KREP
Definition: facilo.h:4
subroutine lfinaf(KREP, KNUMER, KNALDO, KNTROU, KNARES, KNAMAX)
Definition: lfinaf.F90:146
subroutine lfierf(KREP, KNUMER, LDERFA)
Definition: lfierf.F90:99
int(* is_verb)(struct lfi_hndl_t *, integer64 *)
Definition: lfi_hndl.h:24
subroutine lfiomg(KNIVAU, KULOUT)
Definition: lfiomg.F90:90
struct lfi_hndl_t * next
Definition: lfi_hndl.h:22
subroutine lfinsg(KNIVAU)
Definition: lfinsg.F90:116
lfi_hndl_t * lfi_hndl_list(void *data)
Definition: lfi_hndl.c:18
subroutine lfiomf(KREP, KNUMER, KNIMES)
Definition: lfiomf.F90:99
long long int integer64
Definition: lfi_type.h:15
subroutine lfioeg(KNIVAU)
Definition: lfioeg.F90:89
void(* lfisfm)(int, struct lfi_hndl_t *, LFISFM_ARGS_DECL)
Definition: lfi_verb.h:60
subroutine lfilas(KREP, KNUMER, CDNOMA, KTAB, KLONG)
Definition: lfilas.F90:290
void lfiouv_mt64_(LFIOUV_ARGS_DECL)
Definition: lfi_intf.c:119
void(* lfiafm)(LFIAFM_ARGS_DECL)
Definition: lfi_call.h:49
subroutine lfimst(KREP, KNUMER, LDIMST)
Definition: lfimst.F90:103
subroutine lfifra(LDFRAN)
Definition: lfifra.F90:90
int character_len
Definition: lfi_type.h:17
subroutine lfipos(KREP, KNUMER)
Definition: lfipos.F90:122
void(* lfiouv)(LFIOUV_ARGS_DECL)
Definition: lfi_call.h:21
subroutine lfisup(KREP, KNUMER, CDNOMA, KLONUT)
Definition: lfisup.F90:389
lfi_grok_t lfi_grok(const character *file, character_len file_len)
Definition: lfi_grok.c:36
lficb_t * cb
Definition: lfi_hndl.h:19
char character
Definition: lfi_type.h:18
void lfi_abor(const char *fmt,...)
Definition: lfi_abor.c:21
int lfi_unum(integer64 *KNUMER)
Definition: lfi_grok.c:146
subroutine lfinim(KREP, KNUMER, KNIMES)
Definition: lfinim.F90:102
lfi_intf(lfineg, LFINEG)
Definition: lfi_intf.c:249
subroutine lfiopt(KREP, KNUMER, LDNOMM, CDNOMF, CDSTTO, LDERFA, LDIMST, KNIMES)
Definition: lfiopt.F90:104
void(* lfisfm)(LFISFM_ARGS_DECL)
Definition: lfi_call.h:56
void(* lfiafm)(int, struct lfi_hndl_t *, LFIAFM_ARGS_DECL)
Definition: lfi_verb.h:53
lfi_intf_knumer_krep(lficas, LFICAS)
Definition: lfi_intf.c:196
void * data
Definition: lfi_hndl.h:21
subroutine lfinmg(KNIVAU, KULOUT)
Definition: lfinmg.F90:133
void(* lfiofm)(int, struct lfi_hndl_t *, LFIOFM_ARGS_DECL)
Definition: lfi_verb.h:33
subroutine lfiini(KOPTIO)
Definition: lfiini.F90:260
lfi_hndl_t * lfi_hndl(void *data, integer64 *KNUMER)
Definition: lfi_hndl.c:41
subroutine lficfg()
Definition: lficfg.F90:275
lficb_verb_t * cb_verb
Definition: lfi_hndl.h:20
subroutine lfinfo(KREP, KNUMER, CDNOMA, KLONG, KPOSEX)
Definition: lfinfo.F90:254
subroutine lfineg(KNIVAU)
Definition: lfineg.F90:115
INTERFACE SUBROUTINE FACILO KNUMER
Definition: facilo.h:4
static void fatal_error(const char *func, integer64 *KREP)
Definition: lfi_intf.c:32
int(* is_open)(struct lfi_hndl_t *, integer64 *)
Definition: lfi_hndl.h:25
subroutine lfioef(KREP, KNUMER, LDERFA)
Definition: lfioef.F90:101
subroutine lfiver(PVEROU, CDSENS)
Definition: lfiver.F90:73
void(* lfiofm)(LFIOFM_ARGS_DECL)
Definition: lfi_call.h:29
subroutine lfilec(KREP, KNUMER, CDNOMA, KTAB, KLONG)
Definition: lfilec.F90:292
subroutine lfinum(KNUMER, KRANG)
Definition: lfinum.F90:105
subroutine lfilaf(KREP, KNUMER, LDTOUT)
Definition: lfilaf.F90:623
subroutine lficap(KREP, KNUMER, CDNOMA, KLONG, KPOSEX, LDRECU)
Definition: lficap.F90:251
subroutine lfiosg(KNIVAU)
Definition: lfiosg.F90:86
lficb_verb_t lficb_verb
Definition: lfi_verb.c:534
lfi_grok_t
Definition: lfi_grok.h:14
static void missing_handler(integer64 *KNUMER)
Definition: lfi_intf.c:27