source: trunk/MESOSCALE/LMD_MM_MARS/SRC/WRFV2/tools/gen_defs.c @ 1759

Last change on this file since 1759 was 11, checked in by aslmd, 14 years ago

spiga@svn-planeto:ajoute le modele meso-echelle martien

File size: 8.9 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <strings.h>
5
6#include "protos.h"
7#include "registry.h"
8#include "data.h"
9
10enum sw_ranges { COLON_RANGE , ARGADJ , GRIDREF } ;
11enum sw_pointdecl { POINTERDECL , NOPOINTERDECL } ;
12
13int
14gen_state_struct ( char * dirname )
15{
16  FILE * fp ;
17  char  fname[NAMELEN] ;
18  char * fn = "state_struct.inc" ;
19
20  strcpy( fname, fn ) ;
21  if ( strlen(dirname) > 0 ) { sprintf(fname,"%s/%s",dirname,fn) ; }
22  if ((fp = fopen( fname , "w" )) == NULL ) return(1) ;
23  print_warning(fp,fname) ;
24  gen_decls ( fp , "", &Domain , COLON_RANGE , POINTERDECL , FIELD | RCONFIG | FOURD , DRIVER_LAYER ) ;
25  close_the_file( fp ) ;
26  return(0) ;
27}
28
29int
30gen_state_subtypes ( char * dirname )
31{
32  FILE * fp ;
33  char  fname[NAMELEN] ;
34  char * fn = "state_subtypes.inc" ;
35
36  strcpy( fname, fn ) ;
37  if ( strlen(dirname) > 0 ) { sprintf(fname,"%s/%s",dirname,fn) ; }
38
39  if ((fp = fopen( fname , "w" )) == NULL ) return(1) ;
40  print_warning(fp,fname) ;
41  gen_state_subtypes1( fp , &Domain , COLON_RANGE , POINTERDECL , FIELD | RCONFIG | FOURD ) ;
42  close_the_file(fp) ;
43  return(0) ;
44}
45
46int
47gen_dummy_decls ( char * dn )
48{
49  int i ;
50  FILE * fp ;
51  char fname[NAMELEN] ;
52  char corename[NAMELEN] ;
53  char * fn = "_dummy_decl.inc" ;
54
55  if ( dn == NULL ) return(1) ;
56  for ( i = 0 ; i < get_num_cores() ; i++ )
57  {
58    strcpy( corename , get_corename_i(i) ) ;
59    if ( strlen(dn) > 0 ) { sprintf(fname,"%s/%s%s",dn,corename,fn) ; }
60    else                  { sprintf(fname,"%s%s",corename,fn) ; }
61    if ((fp = fopen( fname , "w" )) == NULL ) continue ;
62    print_warning(fp,fname) ;
63#if 0
64    gen_decls ( fp, corename, &Domain , GRIDREF , NOPOINTERDECL , FIELD | RCONFIG | FOURD , MEDIATION_LAYER ) ;
65#else
66    gen_decls ( fp, corename, &Domain , GRIDREF , NOPOINTERDECL , FIELD | FOURD , MEDIATION_LAYER ) ;
67#endif
68    fprintf(fp,"#undef COPY_IN\n") ;
69    fprintf(fp,"#undef COPY_OUT\n") ;
70    close_the_file( fp ) ;
71  }
72  return(0);
73}
74
75int
76gen_dummy_decls_new ( char * dn )
77{
78  int i ;
79  FILE * fp ;
80  char fname[NAMELEN] ;
81  char corename[NAMELEN] ;
82  char * fn = "_dummy_new_decl.inc" ;
83
84  if ( dn == NULL ) return(1) ;
85  for ( i = 0 ; i < get_num_cores() ; i++ )
86  {
87    strcpy( corename , get_corename_i(i) ) ;
88    if ( strlen(dn) > 0 ) { sprintf(fname,"%s/%s%s",dn,corename,fn) ; }
89    else                  { sprintf(fname,"%s%s",corename,fn) ; }
90    if ((fp = fopen( fname , "w" )) == NULL ) continue ;
91    print_warning(fp,fname) ;
92    gen_decls ( fp, corename, &Domain , GRIDREF , NOPOINTERDECL , FOURD | FIELD | BDYONLY , MEDIATION_LAYER ) ;
93    fprintf(fp,"#undef COPY_IN\n") ;
94    fprintf(fp,"#undef COPY_OUT\n") ;
95    close_the_file( fp ) ;
96  }
97  return(0);
98}
99
100
101int
102gen_i1_decls ( char * dn )
103{
104  int i ;
105  FILE * fp ;
106  char  fname[NAMELEN], post[NAMELEN] ;
107  char * fn = "_i1_decl.inc" ;
108  char corename[NAMELEN] ;
109  char * dimspec ;
110  node_t * p ; 
111
112  if ( dn == NULL ) return(1) ;
113  for ( i = 0 ; i < get_num_cores() ; i++ )
114  {
115    strcpy(corename,get_corename_i(i)) ;
116    if ( strlen(dn) > 0 ) { sprintf(fname,"%s/%s%s",dn,corename,fn) ; }
117    else                  { sprintf(fname,"%s%s",corename,fn) ; }
118    if ((fp = fopen( fname , "w" )) == NULL ) continue ;
119    print_warning(fp,fname) ;
120    gen_decls ( fp , corename, &Domain , GRIDREF , NOPOINTERDECL , I1 , MEDIATION_LAYER ) ;
121
122    /* now generate tendencies for 4d vars if specified  */
123    for ( p = FourD ; p != NULL ; p = p->next )
124    {
125      if ( p->node_kind & FOURD && p->has_scalar_array_tendencies )
126      {
127        sprintf(fname,"%s_tend",p->name) ;
128        sprintf(post,",num_%s)",p->name) ;
129        dimspec=dimension_with_ranges( "grid%",",DIMENSION(",t2,p,post,"" ) ;
130        /*          type dim pdecl   name */
131        fprintf(fp, "%-10s%-20s%-10s :: %s\n",
132                    field_type( t1, p ) ,
133                    dimspec ,
134                    "" ,
135                    fname ) ;
136        sprintf(fname,"%s_old",p->name) ;
137        sprintf(post,",num_%s)",p->name) ;
138        dimspec=dimension_with_ranges( "grid%",",DIMENSION(",t2,p,post,"" ) ;
139        /*          type dim pdecl   name */
140        fprintf(fp, "#ifndef NO_I1_OLD\n") ;
141        fprintf(fp, "%-10s%-20s%-10s :: %s\n",
142                    field_type( t1, p ) ,
143                    dimspec ,
144                    "" ,
145                    fname ) ;
146        fprintf(fp, "#endif\n") ;
147
148      }
149    }
150    close_the_file( fp ) ;
151  }
152  return(0) ;
153}
154
155int
156gen_decls ( FILE * fp , char * corename , node_t * node , int sw_ranges, int sw_point , int mask , int layer )
157{
158  node_t * p ; 
159  int tag, ipass ;
160  char fname[NAMELEN], post[NAMELEN] ;
161  char * dimspec ;
162  int bdyonly = 0 ;
163
164  if ( node == NULL ) return(1) ;
165
166  bdyonly = mask & BDYONLY ;
167
168/* make two passes; the first is for scalars, second for arrays.                     */
169/* do it this way so that the scalars get declared first (some compilers complain    */
170/* if a scalar is used to declare an array before it's declared)                     */
171
172  for ( ipass = 0 ; ipass < 2 ; ipass++ ) 
173  {
174  for ( p = node->fields ; p != NULL ; p = p->next )
175  {
176    if ( p->node_kind & mask )
177    {
178      /* add an extra dimension to the 4d arrays.                                       */
179      /* note the call to dimension_with_colons, below, does this by itself             */
180      /* but dimension_with_ranges needs help (since the last arg is not just a colon)  */
181
182      if       ( p->node_kind & FOURD ) { 
183          sprintf(post,",num_%s)",field_name(t4,p,0)) ;
184      } else { 
185          sprintf(post,")") ;
186      }
187
188      for ( tag = 1 ; tag <= p->ntl ; tag++ ) 
189      {
190
191        /* if this is a core-specific variable, if we are generating non-driver-layer              */
192        /* declarations, and if this not a variable for the core named in corename, short-circuit  */
193        if (!strncmp( p->use, "dyn_", 4 ) && layer != DRIVER_LAYER && strcmp( p->use+4, corename)) continue ;
194
195        /* if this is a core-specific variable, prepend the name of the core to                    */
196        /* the variable at the driver level                                                        */
197        if (!strncmp( p->use, "dyn_", 4 ) && layer == DRIVER_LAYER )
198          sprintf(fname,"%s_%s",p->use+4,field_name(t4,p,(p->ntl>1)?tag:0)) ;
199        else
200          strcpy(fname,field_name(t4,p,(p->ntl>1)?tag:0)) ;
201
202        switch ( sw_ranges )
203        {
204          case COLON_RANGE :
205            dimspec=dimension_with_colons( ",DIMENSION(",t2,p,")" ) ; break ;
206          case GRIDREF :
207            dimspec=dimension_with_ranges( "grid%",",DIMENSION(",t2,p,post,"" ) ; break ;
208          case ARGADJ :
209            dimspec=dimension_with_ranges( "",",DIMENSION(",t2,p,post,"" ) ; break ;
210        }
211
212        if ( !strcmp( dimspec, "" ) && ipass == 1 ) continue ; /* short circuit scalars on 2nd pass  */
213        if (  strcmp( dimspec, "" ) && ipass == 0 ) continue ; /* short circuit arrays on 2nd pass   */
214        if ( bdyonly && p->node_kind & FIELD && ! p->boundary_array )  continue ;  /* short circuit all fields except bdy arrrays */
215
216        /*          type dim pdecl   name */
217        fprintf(fp, "%-10s%-20s%-10s :: %s\n",
218                    field_type( t1, p ) ,
219                    dimspec ,
220                    (sw_point==POINTERDECL)?declare_array_as_pointer(t3,p):"" ,
221                    fname ) ;
222      }
223    }
224  }
225  }
226  return(0) ;
227}
228
229int
230gen_state_subtypes1 ( FILE * fp , node_t * node , int sw_ranges , int sw_point , int mask )
231{
232  node_t * p ;
233  int i ;
234  int new;
235  char TypeName [NAMELEN] ;
236  char tempname [NAMELEN] ;
237  if ( node == NULL ) return(1) ;
238  for ( p = node->fields ; p != NULL ; p = p->next )
239  {
240    if ( p->type != NULL )
241      if ( p->type->type_type == DERIVED )
242      {
243        new = 1 ;    /* determine if this is a new type -ajb */
244        strcpy( tempname, p->type->name ) ;
245        for ( i = 0 ; i < get_num_typedefs() ; i++ )       
246        { 
247          strcpy( TypeName, get_typename_i(i) ) ;
248          if ( ! strcmp( TypeName, tempname ) ) new = 0 ;
249        }
250
251        if ( new )   /* add this type to the history and generate declarations -ajb */
252        {
253          add_typedef_name ( tempname ) ;
254          gen_state_subtypes1 ( fp , p->type , sw_ranges , sw_point , mask ) ;
255          fprintf(fp,"TYPE %s\n",p->type->name) ;
256          gen_decls ( fp , "", p->type , sw_ranges , sw_point , mask , DRIVER_LAYER ) ;
257          fprintf(fp,"END TYPE %s\n",p->type->name) ;
258        }
259      }
260  }
261  return(0) ;
262}
263
264/* old version of gen_state_subtypes1 -ajb */
265/*
266int
267gen_state_subtypes1 ( FILE * fp , node_t * node , int sw_ranges , int sw_point , int mask )
268{
269  node_t * p ;
270  int tag ;
271  if ( node == NULL ) return(1) ;
272  for ( p = node->fields ; p != NULL ; p = p->next )
273  {
274    if ( p->type != NULL )
275      if ( p->type->type_type == DERIVED )
276      {
277        gen_state_subtypes1 ( fp , p->type , sw_ranges , sw_point , mask ) ;
278        fprintf(fp,"TYPE %s\n",p->type->name) ;
279        gen_decls ( fp , "", p->type , sw_ranges , sw_point , mask , DRIVER_LAYER ) ;
280        fprintf(fp,"END TYPE %s\n",p->type->name) ;
281      }
282  }
283  return(0) ;
284}
285*/
Note: See TracBrowser for help on using the repository browser.