@@ -424,7 +424,7 @@ int build_dimension_information(ezxml_t registry, ezxml_t var, int *ndims, int *
424424}/*}}}*/
425425
426426
427- int get_field_information (const char * vartype , const char * varval , char * default_value , int * type ){/*{{{*/
427+ int get_field_information (const char * vartype , const char * varval , char * default_value , const char * varmissval , char * missing_value , int * type ){/*{{{*/
428428 if (strcmp (vartype , "real" ) == 0 ){
429429 (* type ) = REAL ;
430430 if (!varval ){
@@ -448,6 +448,29 @@ int get_field_information(const char *vartype, const char *varval, char *default
448448 }
449449 }
450450
451+ if (strcmp (vartype , "real" ) == 0 ){
452+ (* type ) = REAL ;
453+ if (!varmissval ){
454+ snprintf (missing_value , 1024 , "MPAS_REAL_FILLVAL" );
455+ } else {
456+ snprintf (missing_value , 1024 , "%s" , varmissval );
457+ }
458+ } else if (strcmp (vartype , "integer" ) == 0 ){
459+ (* type ) = INTEGER ;
460+ if (!varmissval ){
461+ snprintf (missing_value , 1024 , "MPAS_INT_FILLVAL" );
462+ } else {
463+ snprintf (missing_value , 1024 , "%s" , varmissval );
464+ }
465+ } else if (strcmp (vartype , "text" ) == 0 ){
466+ (* type ) = CHARACTER ;
467+ if (!varmissval ){
468+ snprintf (missing_value , 1024 , "MPAS_CHAR_FILLVAL" );
469+ } else {
470+ snprintf (missing_value , 1024 , "'%s'" , varmissval );
471+ }
472+ }
473+
451474 return 0 ;
452475}/*}}}*/
453476
@@ -952,7 +975,7 @@ int parse_var_array(FILE *fd, ezxml_t registry, ezxml_t superStruct, ezxml_t var
952975
953976 const char * structname , * structlevs , * structpackages ;
954977 const char * substructname ;
955- const char * vararrname , * vararrtype , * vararrdims , * vararrpersistence , * vararrdefaultval , * vararrpackages ;
978+ const char * vararrname , * vararrtype , * vararrdims , * vararrpersistence , * vararrdefaultval , * vararrpackages , * vararrmissingval ;
956979 const char * varname , * varpersistence , * vartype , * vardims , * varunits , * vardesc , * vararrgroup , * varstreams , * vardefaultval , * varpackages ;
957980 const char * varname2 , * vararrgroup2 , * vararrname_in_code ;
958981 const char * varname_in_code ;
@@ -974,6 +997,7 @@ int parse_var_array(FILE *fd, ezxml_t registry, ezxml_t superStruct, ezxml_t var
974997 char pointer_name [1024 ];
975998 char spacing [1024 ], sub_spacing [1024 ];
976999 char default_value [1024 ];
1000+ char missing_value [1024 ];
9771001
9781002 structname = ezxml_attr (superStruct , "name" );
9791003
@@ -986,6 +1010,7 @@ int parse_var_array(FILE *fd, ezxml_t registry, ezxml_t superStruct, ezxml_t var
9861010 vararrdims = ezxml_attr (var_arr_xml , "dimensions" );
9871011 vararrpersistence = ezxml_attr (var_arr_xml , "persistence" );
9881012 vararrdefaultval = ezxml_attr (var_arr_xml , "default_value" );
1013+ vararrmissingval = ezxml_attr (var_arr_xml , "missing_value" );
9891014 vararrpackages = ezxml_attr (var_arr_xml , "packages" );
9901015 vararrtimelevs = ezxml_attr (var_arr_xml , "time_levs" );
9911016 vararrname_in_code = ezxml_attr (var_arr_xml , "name_in_code" );
@@ -1016,7 +1041,7 @@ int parse_var_array(FILE *fd, ezxml_t registry, ezxml_t superStruct, ezxml_t var
10161041 snprintf (spacing , 1024 , " " );
10171042
10181043 // Determine field type and default value.
1019- get_field_information (vararrtype , vararrdefaultval , default_value , & type );
1044+ get_field_information (vararrtype , vararrdefaultval , default_value , vararrmissingval , missing_value , & type );
10201045
10211046 // Determine ndims, hasTime, and decomp type
10221047 build_dimension_information (registry , var_arr_xml , & ndims , & hasTime , & decomp );
@@ -1290,25 +1315,26 @@ int parse_var_array(FILE *fd, ezxml_t registry, ezxml_t superStruct, ezxml_t var
12901315 vardesc = ezxml_attr (var_xml , "description" );
12911316 varunits = ezxml_attr (var_xml , "units" );
12921317
1293- if ( vardesc != NULL || varunits != NULL ) {
1294- if (!varname_in_code ){
1295- varname_in_code = ezxml_attr (var_xml , "name" );
1296- }
1318+ if (!varname_in_code ){
1319+ varname_in_code = ezxml_attr (var_xml , "name" );
1320+ }
12971321
1298- fortprintf (fd , " if (associated(newSubPool)) then\n" );
1299- fortprintf (fd , " call mpas_pool_get_dimension(newSubPool, 'index_%s', const_index)\n" , varname_in_code );
1300- fortprintf (fd , " end if\n" );
1301- fortprintf (fd , " if (const_index > 0) then\n" , spacing );
1302- if ( vardesc != NULL ) {
1303- fortprintf (fd , " call mpas_add_att(%s(%d) %% attLists(const_index) %% attList, 'long_name', '%s')\n" , pointer_name , time_lev , vardesc );
1304- }
1322+ fortprintf (fd , " if (associated(newSubPool)) then\n" );
1323+ fortprintf (fd , " call mpas_pool_get_dimension(newSubPool, 'index_%s', const_index)\n" , varname_in_code );
1324+ fortprintf (fd , " end if\n" );
1325+ fortprintf (fd , " if (const_index > 0) then\n" , spacing );
1326+ if ( vardesc != NULL ) {
1327+ fortprintf (fd , " call mpas_add_att(%s(%d) %% attLists(const_index) %% attList, 'long_name', '%s')\n" , pointer_name , time_lev , vardesc );
1328+ }
13051329
1306- if ( varunits != NULL ) {
1307- fortprintf (fd , " call mpas_add_att(%s(%d) %% attLists(const_index) %% attList, 'units', '%s')\n" , pointer_name , time_lev , varunits );
1308- }
1309- fortprintf (fd , " %s(%d) %% constituentNames(const_index) = '%s'\n" , pointer_name , time_lev , varname );
1310- fortprintf (fd , " end if\n" , spacing );
1330+ if ( varunits != NULL ) {
1331+ fortprintf (fd , " call mpas_add_att(%s(%d) %% attLists(const_index) %% attList, 'units', '%s')\n" , pointer_name , time_lev , varunits );
13111332 }
1333+
1334+ fortprintf (fd , " call mpas_add_att(%s(%d) %% attLists(const_index) %% attList, 'missing_value', %s)\n" , pointer_name , time_lev , missing_value );
1335+ fortprintf (fd , " call mpas_add_att(%s(%d) %% attLists(const_index) %% attList, '_FillValue', %s)\n" , pointer_name , time_lev , missing_value );
1336+ fortprintf (fd , " %s(%d) %% constituentNames(const_index) = '%s'\n" , pointer_name , time_lev , varname );
1337+ fortprintf (fd , " end if\n" , spacing );
13121338 }
13131339
13141340
@@ -1356,7 +1382,7 @@ int parse_var(FILE *fd, ezxml_t registry, ezxml_t superStruct, ezxml_t currentVa
13561382 const char * structtimelevs , * vartimelevs ;
13571383 const char * structname , * structlevs , * structpackages ;
13581384 const char * substructname ;
1359- const char * varname , * varpersistence , * vartype , * vardims , * varunits , * vardesc , * vararrgroup , * varstreams , * vardefaultval , * varpackages ;
1385+ const char * varname , * varpersistence , * vartype , * vardims , * varunits , * vardesc , * vararrgroup , * varstreams , * vardefaultval , * varpackages , * varmissingval ;
13601386 const char * varname2 , * vararrgroup2 ;
13611387 const char * varname_in_code ;
13621388 const char * streamname , * streamname2 ;
@@ -1373,6 +1399,7 @@ int parse_var(FILE *fd, ezxml_t registry, ezxml_t superStruct, ezxml_t currentVa
13731399 char pointer_name [1024 ];
13741400 char package_spacing [1024 ];
13751401 char default_value [1024 ];
1402+ char missing_value [1024 ];
13761403
13771404 var_xml = currentVar ;
13781405
@@ -1390,6 +1417,7 @@ int parse_var(FILE *fd, ezxml_t registry, ezxml_t superStruct, ezxml_t currentVa
13901417 varname_in_code = ezxml_attr (var_xml , "name_in_code" );
13911418 varunits = ezxml_attr (var_xml , "units" );
13921419 vardesc = ezxml_attr (var_xml , "description" );
1420+ varmissingval = ezxml_attr (var_xml , "missing_value" );
13931421
13941422 if (!varname_in_code ){
13951423 varname_in_code = ezxml_attr (var_xml , "name" );
@@ -1412,9 +1440,8 @@ int parse_var(FILE *fd, ezxml_t registry, ezxml_t superStruct, ezxml_t currentVa
14121440
14131441 fortprintf (fd , "! Define variable %s\n" , varname );
14141442
1415-
14161443 // Determine field type and default value.
1417- get_field_information (vartype , vardefaultval , default_value , & type );
1444+ get_field_information (vartype , vardefaultval , default_value , varmissingval , missing_value , & type );
14181445
14191446 // Determine ndims, hasTime, and decomp type
14201447 build_dimension_information (registry , var_xml , & ndims , & hasTime , & decomp );
@@ -1469,8 +1496,9 @@ int parse_var(FILE *fd, ezxml_t registry, ezxml_t superStruct, ezxml_t currentVa
14691496 free (tofree );
14701497 }
14711498
1499+ fortprintf (fd , " %s(%d) %% defaultValue = %s\n" , pointer_name , time_lev , default_value );
1500+ fortprintf (fd , " %s(%d) %% defaultValue = %s\n" , pointer_name , time_lev , default_value );
14721501 if ( ndims > 0 ) {
1473- fortprintf (fd , " %s(%d) %% defaultValue = %s\n" , pointer_name , time_lev , default_value );
14741502 fortprintf (fd , " nullify(%s(%d) %% array)\n" , pointer_name , time_lev );
14751503 } else {
14761504 fortprintf (fd , " %s(%d) %% scalar = %s\n" , pointer_name , time_lev , default_value );
@@ -1490,6 +1518,9 @@ int parse_var(FILE *fd, ezxml_t registry, ezxml_t superStruct, ezxml_t currentVa
14901518 fortprintf (fd , " call mpas_add_att(%s(%d) %% attLists(1) %% attList, 'long_name', '%s')\n" , pointer_name , time_lev , vardesc );
14911519 }
14921520
1521+ fortprintf (fd , " call mpas_add_att(%s(%d) %% attLists(1) %% attList, 'missing_value', %s)\n" , pointer_name , time_lev , missing_value );
1522+ fortprintf (fd , " call mpas_add_att(%s(%d) %% attLists(1) %% attList, '_FillValue', %s)\n" , pointer_name , time_lev , missing_value );
1523+
14931524 fortprintf (fd , " %s(%d) %% block => block\n" , pointer_name , time_lev );
14941525
14951526 }
@@ -1690,7 +1721,7 @@ int generate_struct_links(FILE *fd, int curLevel, ezxml_t superStruct, ezxml_t r
16901721 const char * structname ;
16911722 const char * vartimelevs ;
16921723 const char * varname , * vardims , * vartype ;
1693- const char * vardefaultval ;
1724+ const char * vardefaultval , * varmissingval ;
16941725 const char * varname_in_code ;
16951726 int depth ;
16961727 int err ;
@@ -1701,6 +1732,7 @@ int generate_struct_links(FILE *fd, int curLevel, ezxml_t superStruct, ezxml_t r
17011732 char * string , * tofree , * token ;
17021733 char pointer_name [1024 ];
17031734 char default_value [1024 ];
1735+ char missing_value [1024 ];
17041736
17051737 depth = curLevel + 1 ;
17061738
@@ -1743,6 +1775,7 @@ int generate_struct_links(FILE *fd, int curLevel, ezxml_t superStruct, ezxml_t r
17431775 vartimelevs = ezxml_attr (var_arr_xml , "time_levs" );
17441776 vartype = ezxml_attr (var_arr_xml , "type" );
17451777 vardefaultval = ezxml_attr (var_arr_xml , "default_value" );
1778+ varmissingval = ezxml_attr (var_arr_xml , "missing_value" );
17461779
17471780 if (!vartimelevs ){
17481781 vartimelevs = ezxml_attr (subStruct , "time_levs" );
@@ -1757,8 +1790,12 @@ int generate_struct_links(FILE *fd, int curLevel, ezxml_t superStruct, ezxml_t r
17571790 time_levs = 1 ;
17581791 }
17591792
1793+ if (!varmissingval ){
1794+ varmissingval = vardefaultval ;
1795+ }
1796+
17601797 // Determine field type and default value.
1761- get_field_information (vartype , vardefaultval , default_value , & type );
1798+ get_field_information (vartype , vardefaultval , default_value , varmissingval , missing_value , & type );
17621799
17631800 // Determine number of dimensions
17641801 // and decomp type
@@ -1809,6 +1846,7 @@ int generate_struct_links(FILE *fd, int curLevel, ezxml_t superStruct, ezxml_t r
18091846 vartimelevs = ezxml_attr (var_xml , "time_levs" );
18101847 vartype = ezxml_attr (var_xml , "type" );
18111848 vardefaultval = ezxml_attr (var_xml , "default_value" );
1849+ varmissingval = ezxml_attr (var_xml , "missing_value" );
18121850 varname_in_code = ezxml_attr (var_xml , "name_in_code" );
18131851
18141852 if (!vartimelevs ){
@@ -1828,8 +1866,12 @@ int generate_struct_links(FILE *fd, int curLevel, ezxml_t superStruct, ezxml_t r
18281866 varname_in_code = ezxml_attr (var_xml , "name" );
18291867 }
18301868
1869+ if (!varmissingval ){
1870+ varmissingval = vardefaultval ;
1871+ }
1872+
18311873 // Determine field type and default value.
1832- get_field_information (vartype , vardefaultval , default_value , & type );
1874+ get_field_information (vartype , vardefaultval , default_value , varmissingval , missing_value , & type );
18331875
18341876 // Determine number of dimensions
18351877 // and decomp type
0 commit comments