SURFEX v8.1
General documentation of Surfex
lfi_hndl.c
Go to the documentation of this file.
1 /**** *lfi_hndl.c* - LFI handle
2  *
3  * Author.
4  * -------
5  * Philippe Marguinaud *METEO-FRANCE*
6  * Original : 12-08-2013
7  *
8  */
9 #include <stdlib.h>
10 #include <string.h>
11 #include "lfi_type.h"
12 #include "lfi_hndl.h"
13 #include "lfi_fort.h"
14 #include "lfi_alts.h"
15 #include "lfi_altm.h"
16 
17 /* Build the list of possible LFI libraries */
18 lfi_hndl_t * lfi_hndl_list (void * data)
19 {
20  lficom_t * lficom = data;
21 
22  if (strncmp (lficom->cmagic, "LFI_FORT", 8))
23  abort ();
24 
25  if (lficom->lfihl == NULL)
26  {
27  lfi_hndl_t * lfi_fort = lfi_get_fort_hndl (data);
28  lfi_hndl_t * lfi_alts = lfi_get_alts_hndl (data);
29  lfi_hndl_t * lfi_altm = lfi_get_altm_hndl (data);
30 
31  lfi_fort->next = lfi_alts;
32  lfi_alts->next = lfi_altm;
33 
34  lficom->lfihl = lfi_fort;
35  }
36 
37  return lficom->lfihl;
38 }
39 
40 /* Find out which LFI library opened a given unit (KNUMER) */
41 lfi_hndl_t * lfi_hndl (void * data, integer64 * KNUMER)
42 {
43  lfi_hndl_t * lfi;
44  for (lfi = lfi_hndl_list (data); lfi; lfi = lfi->next)
45  if (lfi->is_open (lfi, KNUMER))
46  break;
47  return lfi;
48 }
49 
50 /* Free all LFI libraries;
51  * this routine should be called by FREE_LFI in lfimod.F90
52  */
53 void lfi_hndl_free_ (void * data)
54 {
55  lficom_t * lficom = data;
56  lfi_hndl_t * lfi;
57 
58  if (strncmp (lficom->cmagic, "LFI_FORT", 8))
59  abort ();
60 
61  for (lfi = lficom->lfihl; lfi; )
62  {
63  lfi_hndl_t * lfj = lfi->next;
64  lfi->destroy (lfi);
65  lfi = lfj;
66  }
67 }
68 
69 
70 
71 
character cmagic[8]
Definition: lfi_fort.h:69
lfi_hndl_t * lfi_get_altm_hndl(void *data)
Definition: lfi_altm.c:1965
lfi_hndl_t * lfi_get_alts_hndl(void *data)
Definition: lfi_alts.c:1792
void * lfihl
Definition: lfi_fort.h:70
void lfi_hndl_free_(void *data)
Definition: lfi_hndl.c:53
void(* destroy)(struct lfi_hndl_t *)
Definition: lfi_hndl.h:23
struct lfi_hndl_t * next
Definition: lfi_hndl.h:22
lfi_hndl_t * lfi_hndl_list(void *data)
Definition: lfi_hndl.c:18
long long int integer64
Definition: lfi_type.h:15
lfi_hndl_t * lfi_get_fort_hndl(void *data)
Definition: lfi_fort.c:92
lfi_hndl_t * lfi_hndl(void *data, integer64 *KNUMER)
Definition: lfi_hndl.c:41
INTERFACE SUBROUTINE FACILO KNUMER
Definition: facilo.h:4
int(* is_open)(struct lfi_hndl_t *, integer64 *)
Definition: lfi_hndl.h:25