Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 89bff5c

Browse filesBrowse files
Add missing value to registry and attribute lists
This commit updates the definition of registry to parse the missing_value attribute from variable definitions. The missing_value is then provided through the field types, in case a core wants to set elements to have this value. Additionally, missing_value is added to each field as an attribute so external tools can access what value is missing for each field independently. Additionally, it adds _FillValue, and sets the defaul values of both _FillValue and missing_value to be the NetCDF defined fill value for the correct type.
1 parent 026fd32 commit 89bff5c
Copy full SHA for 89bff5c

File tree

Expand file treeCollapse file tree

4 files changed

+90
-27
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

4 files changed

+90
-27
lines changed
Open diff view settings
Collapse file

‎src/framework/mpas_field_types.inc‎

Copy file name to clipboardExpand all lines: src/framework/mpas_field_types.inc
+13Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
character (len=StrKIND), dimension(5) :: dimNames
2222
integer, dimension(5) :: dimSizes
2323
real (kind=RKIND) :: defaultValue
24+
real (kind=RKIND) :: missingValue
2425
logical :: isDecomposed
2526
logical :: hasTimeDimension
2627
logical :: isActive
@@ -53,6 +54,7 @@
5354
character (len=StrKIND), dimension(4) :: dimNames
5455
integer, dimension(4) :: dimSizes
5556
real (kind=RKIND) :: defaultValue
57+
real (kind=RKIND) :: missingValue
5658
logical :: isDecomposed
5759
logical :: hasTimeDimension
5860
logical :: isActive
@@ -86,6 +88,7 @@
8688
character (len=StrKIND), dimension(3) :: dimNames
8789
integer, dimension(3) :: dimSizes
8890
real (kind=RKIND) :: defaultValue
91+
real (kind=RKIND) :: missingValue
8992
logical :: isDecomposed
9093
logical :: hasTimeDimension
9194
logical :: isActive
@@ -118,6 +121,7 @@
118121
character (len=StrKIND), dimension(2) :: dimNames
119122
integer, dimension(2) :: dimSizes
120123
real (kind=RKIND) :: defaultValue
124+
real (kind=RKIND) :: missingValue
121125
logical :: isDecomposed
122126
logical :: hasTimeDimension
123127
logical :: isActive
@@ -150,6 +154,7 @@
150154
character (len=StrKIND), dimension(1) :: dimNames
151155
integer, dimension(1) :: dimSizes
152156
real (kind=RKIND) :: defaultValue
157+
real (kind=RKIND) :: missingValue
153158
logical :: isDecomposed
154159
logical :: hasTimeDimension
155160
logical :: isActive
@@ -180,6 +185,7 @@
180185
character (len=StrKIND) :: fieldName
181186
character (len=StrKIND), dimension(:), pointer :: constituentNames => null()
182187
real (kind=RKIND) :: defaultValue
188+
real (kind=RKIND) :: missingValue
183189
logical :: isDecomposed
184190
logical :: hasTimeDimension
185191
logical :: isActive
@@ -210,6 +216,7 @@
210216
character (len=StrKIND), dimension(:), pointer :: constituentNames => null()
211217
character (len=StrKIND), dimension(3) :: dimNames
212218
integer :: defaultValue
219+
integer :: missingValue
213220
integer, dimension(3) :: dimSizes
214221
logical :: isDecomposed
215222
logical :: hasTimeDimension
@@ -242,6 +249,7 @@
242249
character (len=StrKIND), dimension(:), pointer :: constituentNames => null()
243250
character (len=StrKIND), dimension(2) :: dimNames
244251
integer :: defaultValue
252+
integer :: missingValue
245253
integer, dimension(2) :: dimSizes
246254
logical :: isDecomposed
247255
logical :: hasTimeDimension
@@ -274,6 +282,7 @@
274282
character (len=StrKIND), dimension(:), pointer :: constituentNames => null()
275283
character (len=StrKIND), dimension(1) :: dimNames
276284
integer :: defaultValue
285+
integer :: missingValue
277286
integer, dimension(1) :: dimSizes
278287
logical :: isDecomposed
279288
logical :: hasTimeDimension
@@ -305,6 +314,7 @@
305314
character (len=StrKIND) :: fieldName
306315
character (len=StrKIND), dimension(:), pointer :: constituentNames => null()
307316
integer :: defaultValue
317+
integer :: missingValue
308318
logical :: isDecomposed
309319
logical :: hasTimeDimension
310320
logical :: isActive
@@ -336,6 +346,7 @@
336346
character (len=StrKIND), dimension(1) :: dimNames
337347
integer, dimension(1) :: dimSizes
338348
character (len=StrKIND) :: defaultValue
349+
character (len=StrKIND) :: missingValue
339350
logical :: isDecomposed
340351
logical :: hasTimeDimension
341352
logical :: isActive
@@ -366,6 +377,7 @@
366377
character (len=StrKIND) :: fieldName
367378
character (len=StrKIND), dimension(:), pointer :: constituentNames => null()
368379
character (len=StrKIND) :: defaultValue
380+
character (len=StrKIND) :: missingValue
369381
logical :: isDecomposed
370382
logical :: hasTimeDimension
371383
logical :: isActive
@@ -395,6 +407,7 @@
395407
character (len=StrKIND) :: fieldName
396408
character (len=StrKIND), dimension(:), pointer :: constituentNames => null()
397409
logical :: defaultValue
410+
logical :: missingValue
398411
logical :: isDecomposed
399412
logical :: hasTimeDimension
400413
logical :: isActive
Collapse file

‎src/framework/mpas_io.F‎

Copy file name to clipboardExpand all lines: src/framework/mpas_io.F
+8Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ module mpas_io
2222
#else
2323
integer, parameter :: PIO_REALKIND = PIO_DOUBLE
2424
#endif
25+
26+
integer, parameter :: MPAS_INT_FILLVAL = NF_FILL_INT
27+
character, parameter :: MPAS_CHAR_FILLVAL = achar(NF_FILL_CHAR)
28+
#ifdef SINGLE_PRECISION
29+
real (kind=RKIND), parameter :: MPAS_REAL_FILLVAL = NF_FILL_FLOAT
30+
#else
31+
real (kind=RKIND), parameter :: MPAS_REAL_FILLVAL = NF_FILL_DOUBLE
32+
#endif
2533

2634
interface MPAS_io_get_var
2735
module procedure MPAS_io_get_var_int0d
Collapse file

‎src/tools/registry/gen_inc.c‎

Copy file name to clipboardExpand all lines: src/tools/registry/gen_inc.c
+68-26Lines changed: 68 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -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
Collapse file

‎src/tools/registry/gen_inc.h‎

Copy file name to clipboardExpand all lines: src/tools/registry/gen_inc.h
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ int add_package_to_list(const char * package, const char * package_list);
1717
int build_struct_package_lists(ezxml_t currentPosition, char * out_packages);
1818
int get_dimension_information(ezxml_t registry, const char *test_dimname, int *has_time, int *decomp);
1919
int build_dimension_information(ezxml_t registry, ezxml_t var, int *ndims, int *has_time, int *decomp);
20-
int get_field_information(const char *vartype, const char *varval, char *default_value, int *type);
20+
int get_field_information(const char *vartype, const char *varval, char *default_value, const char *varmissval, char *missing_value, int *type);
2121
int write_set_field_pointer(FILE *fd, const char *spacing, const char *iterator_name, const char *pool_name);
2222
void write_default_namelist(ezxml_t registry);
2323
int parse_packages_from_registry(ezxml_t registry);

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.