source: trunk/WRF.COMMON/WRFV3/frame/pack_utils.c @ 3567

Last change on this file since 3567 was 2759, checked in by aslmd, 2 years ago

adding unmodified code from WRFV3.0.1.1, expurged from useless data +1M size

File size: 8.6 KB
Line 
1#ifndef MS_SUA
2# include <stdio.h>
3# include <stdlib.h>
4#endif
5#include <string.h>
6
7#ifndef CRAY
8# ifdef NOUNDERSCORE
9#      define INT_PACK_DATA  int_pack_data
10#      define INT_GET_TI_HEADER_C  int_get_ti_header_c
11#      define INT_GEN_TI_HEADER_C  int_gen_ti_header_c
12#      define ADD_TO_BUFSIZE_FOR_FIELD_C  add_to_bufsize_for_field_c
13#      define STORE_PIECE_OF_FIELD_C  store_piece_of_field_c
14#      define RETRIEVE_PIECES_OF_FIELD_C  retrieve_pieces_of_field_c
15#      define INIT_STORE_PIECE_OF_FIELD init_store_piece_of_field
16#      define INIT_RETRIEVE_PIECES_OF_FIELD init_retrieve_pieces_of_field
17#      define PERTURB_REAL perturb_real
18#      define INSPECT_HEADER inspect_header
19# else
20#   ifdef F2CSTYLE
21#      define INT_PACK_DATA  int_pack_data__
22#      define INT_GET_TI_HEADER_C  int_get_ti_header_c__
23#      define INT_GEN_TI_HEADER_C  int_gen_ti_header_c__
24#      define ADD_TO_BUFSIZE_FOR_FIELD_C  add_to_bufsize_for_field_c__
25#      define STORE_PIECE_OF_FIELD_C  store_piece_of_field_c__
26#      define RETRIEVE_PIECES_OF_FIELD_C  retrieve_pieces_of_field_c__
27#      define INIT_STORE_PIECE_OF_FIELD init_store_piece_of_field__
28#      define INIT_RETRIEVE_PIECES_OF_FIELD init_retrieve_pieces_of_field__
29#      define PERTURB_REAL perturb_real__
30#      define INSPECT_HEADER inspect_header__
31#   else
32#      define INT_PACK_DATA  int_pack_data_
33#      define INT_GET_TI_HEADER_C  int_get_ti_header_c_
34#      define INT_GEN_TI_HEADER_C  int_gen_ti_header_c_
35#      define ADD_TO_BUFSIZE_FOR_FIELD_C  add_to_bufsize_for_field_c_
36#      define STORE_PIECE_OF_FIELD_C  store_piece_of_field_c_
37#      define RETRIEVE_PIECES_OF_FIELD_C  retrieve_pieces_of_field_c_
38#      define INIT_STORE_PIECE_OF_FIELD init_store_piece_of_field_
39#      define INIT_RETRIEVE_PIECES_OF_FIELD init_retrieve_pieces_of_field_
40#      define PERTURB_REAL perturb_real_
41#      define INSPECT_HEADER inspect_header_
42#   endif
43# endif
44#endif
45
46#ifdef MEMCPY_FOR_BCOPY
47# define bcopy(A,B,C) memcpy((B),(A),(C))
48#endif
49
50/*    CALL int_pack_data ( hdrbuf , hdrbufsiz * inttypesize , int_local_output_buffer, int_local_output_cursor ) */
51
52INT_PACK_DATA ( unsigned char *buf , int *ninbytes , unsigned char *obuf, int *cursor )
53{
54  int i, lcurs ;
55  lcurs = *cursor - 1 ;
56  for ( i = 0 ; i < *ninbytes ; i++ )
57  {
58    obuf[lcurs++] = buf[i] ;
59  }
60  *cursor = lcurs+1 ;
61}
62
63int
64INT_GEN_TI_HEADER_C ( char * hdrbuf, int * hdrbufsize,           /* hdrbufsize is in bytes */
65                    int * itypesize, int * typesize,
66                    int * DataHandle, char * Data,
67                    int * Count, int * code )
68{
69  int i ;
70  char * p ;
71  p = hdrbuf ;
72  p += sizeof(int) ;
73  bcopy( code, p, sizeof(int) ) ; p += sizeof(int) ;       /* 2 */
74  bcopy( DataHandle, p, sizeof(int) ) ; p += sizeof(int) ; /* 3 */
75  bcopy( typesize, p, sizeof(int) ) ; p += sizeof(int) ;   /* 4 */
76  bcopy( Count, p, sizeof(int) ) ; p += sizeof(int) ;      /* 5 */
77  bcopy( Data, p, *Count * *typesize ) ; p += *Count * *typesize ; /* 6++ */
78  *hdrbufsize = (int) (p - hdrbuf) ;
79  bcopy( hdrbufsize, hdrbuf, sizeof(int) ) ;
80  return(0) ;
81}
82
83int
84INT_GET_TI_HEADER_C ( char * hdrbuf, int * hdrbufsize, int * n,  /* hdrbufsize and n are in bytes */
85                    int * itypesize, int * typesize,
86                    int * DataHandle, char * Data,
87                    int * Count, int * code )
88{
89  int i ;
90  char * p ;
91  p = hdrbuf ;
92  bcopy( p, hdrbufsize, sizeof(int) ) ;     p += sizeof(int) ;        /* 1 */
93  bcopy( p, code, sizeof(int) ) ;           p += sizeof(int) ;        /* 2 */
94  bcopy( p, DataHandle, sizeof(int) ) ;     p += sizeof(int) ;        /* 3 */
95  bcopy( p, typesize, sizeof(int) ) ;       p += sizeof(int) ;        /* 4 */
96  bcopy( p, Count, sizeof(int) ) ;          p += sizeof(int) ;        /* 5 */
97  if ( *Count * *typesize > 0 ) {
98  bcopy( p, Data, *Count * *typesize ) ;  p += *Count * *typesize ; /* 6++ */
99  }
100  *n = (int)( p - hdrbuf ) ;
101  return(0) ;
102}
103
104#define MAX_FLDS 2000
105static char fld_name[MAX_FLDS][256] ;
106static char *fld_cache[MAX_FLDS] ;
107static int fld_curs[MAX_FLDS] ;
108static int fld_bufsize[MAX_FLDS] ;
109static int fld     = 0 ;
110static int numflds = 0 ;
111static int frst = 1 ;
112
113int INIT_STORE_PIECE_OF_FIELD ()
114{
115  int i ;
116  if ( frst ) {
117    for ( i = 0 ; i < MAX_FLDS ; i++ ) {
118      fld_cache[i] = NULL ;
119    }
120    frst = 0 ; 
121  }
122  numflds = 0 ;
123  for ( i = 0 ; i < MAX_FLDS ; i++ ) {
124    strcpy( fld_name[i], "" ) ;
125    if ( fld_cache[i] != NULL ) free( fld_cache[i] ) ;
126    fld_cache[i] = NULL ;
127    fld_curs[i] = 0 ;
128    fld_bufsize[i] = 0 ;
129  }
130  return(0) ;
131}
132
133int INIT_RETRIEVE_PIECES_OF_FIELD ()
134{
135  fld = 0 ;
136  return(0) ;
137}
138
139int
140ADD_TO_BUFSIZE_FOR_FIELD_C ( int varname[], int * chunksize )
141{
142  int i, n ;
143  int found ;
144  char vname[256] ;
145
146  n = varname[0] ;
147  for ( i = 1; i <= n ; i++ ) { vname[i-1] = varname[i] ; }
148  vname[n] = '\0' ;
149
150  found = -1 ;
151  for ( i = 0 ; i < numflds ; i++ ) { if ( !strcmp( fld_name[i], vname ) ) { found = i ; break ; } }
152  if ( found == -1 ) {
153    found = numflds++ ;
154    strcpy( fld_name[found], vname ) ;
155    fld_bufsize[found] = *chunksize ;
156  }
157  else
158  {
159    fld_bufsize[found] += *chunksize ;
160  }
161  if ( fld_cache[found] != NULL ) { free( fld_cache[found] ) ; }
162  fld_cache[found] = NULL ;
163  return(0) ;
164}
165
166int
167STORE_PIECE_OF_FIELD_C ( char * buf , int varname[], int * chunksize, int *retval )
168{
169  int i, n ;
170  int found ;
171  char vname[256] ;
172
173  n = varname[0] ;
174  for ( i = 1; i <= n ; i++ ) { vname[i-1] = varname[i] ; }
175  vname[n] = '\0' ;
176
177  found = -1 ;
178  for ( i = 0 ; i < numflds ; i++ ) { if ( !strcmp( fld_name[i], vname ) ) { found = i ; break ; } }
179  if ( found == -1 ) { 
180#ifndef MS_SUA
181    fprintf(stderr,"frame/pack_utils.c: field (%s) not found; was not set up with add_to_bufsize_for_field\n",vname ) ;
182#endif
183    *retval = 1 ;
184    return(0)  ;
185  }
186
187  if ( fld_cache[found] == NULL ) {
188     fld_cache[found] = (char *) malloc( fld_bufsize[found] ) ;
189     fld_curs[found] = 0 ;
190  }
191
192  if ( fld_curs[found] + *chunksize > fld_bufsize[found] ) {
193#ifndef MS_SUA
194    fprintf(stderr,
195"frame/pack_utils.c: %s would overwrite %d + %d  > %d [%d]\n",vname, fld_curs[found], *chunksize, fld_bufsize[found], found ) ;
196#endif
197    *retval = 1 ;
198    return(0)  ;
199  }
200
201  bcopy( buf, fld_cache[found]+fld_curs[found], *chunksize ) ;
202  fld_curs[found] += *chunksize ;
203  *retval = 0 ;
204  return(0) ;
205}
206
207int
208RETRIEVE_PIECES_OF_FIELD_C ( char * buf , int varname[], int * insize, int * outsize, int *retval )
209{
210  int i, n ;
211  int found ;
212  char vname[256] ;
213
214  if ( fld < numflds ) {
215#ifndef MS_SUA
216    if ( fld_curs[fld] > *insize ) {
217      fprintf(stderr,"retrieve: fld_curs[%d] (%d) > *insize (%d)\n",fld,fld_curs[fld], *insize ) ;
218    }
219#endif
220    *outsize = ( fld_curs[fld] <= *insize ) ? fld_curs[fld] : *insize ;
221    bcopy( fld_cache[fld], buf, *outsize ) ;
222    varname[0] = (int) strlen( fld_name[fld] ) ;
223    for ( i = 1 ; i <= varname[0] ; i++ ) varname[i] = fld_name[fld][i-1] ;
224    if ( fld_cache[fld] != NULL ) free ( fld_cache[fld] ) ;
225    fld_cache[fld] = NULL ;
226    fld_bufsize[fld] = 0 ;
227    fld++ ;
228    *retval = 0 ;
229  }
230  else {
231    numflds = 0 ;
232    *retval = -1 ;
233  }
234  return(0) ;
235}
236
237#define INDEX_2(A,B,NB)       ( (B) + (A)*(NB) )
238#define INDEX_3(A,B,C)  INDEX_2( (A), INDEX_2( (B), (C), (me[1]-ms[1]+1) ), (me[1]-ms[1]+1)*(me[0]-ms[0]+1) )
239/* flip low order bit of fp number */
240int
241PERTURB_REAL ( float * field, int ds[], int de[], int ms[], int me[], int ps[], int pe[] )
242{
243   int i,j,k ;
244   int le ; /* index of little end */
245   float x = 2.0 ;
246   unsigned int y ; 
247   unsigned char a[4], *p ;
248   if ( sizeof(float) != 4 ) return(-1) ;
249   /* check endianness of machine */
250   bcopy ( &x, a, 4 ) ;
251   le = 0 ;
252   if ( a[0] == 0x40 ) le = 3 ;
253   for ( k = ps[2]-ms[2] ; k <= pe[2]-ms[2] ; k++ )
254     for ( j = ps[1]-ms[1] ; j <= pe[1]-ms[1] ; j++ )
255       for ( i = ps[0]-ms[0] ; i <= pe[0]-ms[0] ; i++ )
256       {
257          /* do not change zeros */
258          if ( field[ INDEX_3(k,j,i) ] != 0.0 ) {
259             p = (unsigned char *)&(field[ INDEX_3(k,j,i) ] ) ; 
260             if ( *(p+le) & 1 ) { *(p+le) &= 0x7e ; }
261             else               { *(p+le) |= 1 ; }
262          }
263       }
264   return(0) ;
265}
266
267int INSPECT_HEADER ( char * buf, int * sz, int * line )
268{
269    int i ;
270#ifndef MS_SUA
271    fprintf(stderr,"INSPECT_HEADER: line = %d ", *line ) ;
272    if ( buf != NULL && sz != NULL ) {
273      for ( i = 0 ; i < *sz && i < 256 ; i++ )  { if ( (buf[i] >= 'a' && buf[i] <= 'z') || buf[i] == '_' ||
274                                             (buf[i] >= 'A' && buf[i] <= 'Z') ||
275                                             (buf[i] >= '0' && buf[i] <= '9') ) fprintf(stderr,"%c",buf[i]) ;
276                                    }
277      fprintf(stderr,"\n") ;
278   }
279#endif
280    return(0) ;
281}
282
Note: See TracBrowser for help on using the repository browser.