From cdaf150f84680a3b7aa04999a8e188a823d61d1c Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Aug 2026 07:42:20 -0700 Subject: [PATCH 01/11] fix(dfns): migrate bare (valueless) boolean DFN attributes as true v1 DFN syntax allows a boolean attribute line with no value at all (e.g. a bare `optional` line, as opposed to `optional true`/`optional false`), meaning the attribute is set. `load_dfn` parses such a line to an empty string (as opposed to `None` for a wholly absent attribute), but `try_parse_bool` treated "" as `False` unconditionally, silently inverting the flag regardless of the caller's default. Fixed at the root in `try_parse_bool` rather than patching call sites individually, since the bug affects every boolean DFN attribute that uses the bare-line convention, not just `optional`. Real-corpus impact turned out wider than the printrecord family originally scoped: chf-dfw, chf-disv1d, gwf-npf, olf-dfw, olf-disv1d, swf-dfw, swf-disv1d, and sim-nam also had bare-`optional` fields now migrated correctly. Updates one existing test that had the old buggy rendering of gwf-oc's columns/width/digits baked in as required; they render bracketed as optional now, matching flopy4's independently-confirmed real MF6 behavior for the same fields. Co-Authored-By: Claude Sonnet 5 --- .../dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json | 1 + .../dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml | 1 + .../dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev2/chf-disv1d.json | 2 ++ .../__snapshots__/v2.0.0.dev2/chf-disv1d.toml | 2 ++ .../__snapshots__/v2.0.0.dev2/chf-disv1d.yaml | 2 ++ .../dfns/__snapshots__/v2.0.0.dev2/chf-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev2/chf-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/chf-oc.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/gwe-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev2/gwe-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/gwe-oc.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/gwf-npf.json | 2 ++ .../dfns/__snapshots__/v2.0.0.dev2/gwf-npf.toml | 2 ++ .../dfns/__snapshots__/v2.0.0.dev2/gwf-npf.yaml | 2 ++ .../dfns/__snapshots__/v2.0.0.dev2/gwf-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev2/gwf-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/gwf-oc.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/gwt-ist.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev2/gwt-ist.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/gwt-ist.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/gwt-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev2/gwt-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/gwt-oc.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json | 1 + .../dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml | 1 + .../dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev2/olf-disv1d.json | 3 +++ .../__snapshots__/v2.0.0.dev2/olf-disv1d.toml | 3 +++ .../__snapshots__/v2.0.0.dev2/olf-disv1d.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/olf-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev2/olf-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/olf-oc.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/sim-nam.json | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/sim-nam.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/sim-nam.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json | 1 + .../dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml | 1 + .../dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev2/swf-disv1d.json | 2 ++ .../__snapshots__/v2.0.0.dev2/swf-disv1d.toml | 2 ++ .../__snapshots__/v2.0.0.dev2/swf-disv1d.yaml | 2 ++ .../dfns/__snapshots__/v2.0.0.dev2/swf-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev2/swf-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev2/swf-oc.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json | 1 + .../dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml | 1 + .../dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev3/chf-disv1d.json | 2 ++ .../__snapshots__/v2.0.0.dev3/chf-disv1d.toml | 2 ++ .../__snapshots__/v2.0.0.dev3/chf-disv1d.yaml | 2 ++ .../dfns/__snapshots__/v2.0.0.dev3/chf-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev3/chf-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/chf-oc.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/gwe-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev3/gwe-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/gwe-oc.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/gwf-npf.json | 2 ++ .../dfns/__snapshots__/v2.0.0.dev3/gwf-npf.toml | 2 ++ .../dfns/__snapshots__/v2.0.0.dev3/gwf-npf.yaml | 2 ++ .../dfns/__snapshots__/v2.0.0.dev3/gwf-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev3/gwf-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/gwf-oc.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/gwt-ist.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev3/gwt-ist.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/gwt-ist.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/gwt-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev3/gwt-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/gwt-oc.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json | 1 + .../dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml | 1 + .../dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev3/olf-disv1d.json | 3 +++ .../__snapshots__/v2.0.0.dev3/olf-disv1d.toml | 3 +++ .../__snapshots__/v2.0.0.dev3/olf-disv1d.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/olf-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev3/olf-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/olf-oc.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/sim-nam.json | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/sim-nam.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/sim-nam.yaml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json | 1 + .../dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml | 1 + .../dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev3/swf-disv1d.json | 2 ++ .../__snapshots__/v2.0.0.dev3/swf-disv1d.toml | 2 ++ .../__snapshots__/v2.0.0.dev3/swf-disv1d.yaml | 2 ++ .../dfns/__snapshots__/v2.0.0.dev3/swf-oc.json | 9 ++++++--- .../dfns/__snapshots__/v2.0.0.dev3/swf-oc.toml | 3 +++ .../dfns/__snapshots__/v2.0.0.dev3/swf-oc.yaml | 3 +++ autotest/dfns/test_schema.py | 4 +++- modflow_devtools/misc.py | 15 ++++++++++++--- 92 files changed, 273 insertions(+), 46 deletions(-) diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json index 1abd8597..e22416b4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json @@ -81,6 +81,7 @@ "type": "array", "longname": "mannings roughness coefficient", "description": "mannings roughness coefficient", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml index 28d2363b..593c2c48 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml @@ -72,6 +72,7 @@ developmode = true type = "array" longname = "mannings roughness coefficient" description = "mannings roughness coefficient" +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml index 71d9e7e6..ac112fd3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml @@ -90,6 +90,7 @@ blocks: type: array longname: mannings roughness coefficient description: mannings roughness coefficient + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json index 2ef5486b..c5b08f1c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json @@ -105,6 +105,7 @@ "type": "array", "longname": "width", "description": "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values.", + "optional": true, "dtype": "double", "shape": [ "nodes" @@ -114,6 +115,7 @@ "type": "array", "longname": "bottom elevation for the one-dimensional cell", "description": "bottom elevation for the one-dimensional cell.", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml index 54d67807..3193538a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml @@ -90,6 +90,7 @@ optional = true type = "array" longname = "width" description = "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values." +optional = true dtype = "double" shape = [ "nodes", @@ -99,6 +100,7 @@ shape = [ type = "array" longname = "bottom elevation for the one-dimensional cell" description = "bottom elevation for the one-dimensional cell." +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml index cd14bc73..61d3a27c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml @@ -101,6 +101,7 @@ blocks: description: real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values. + optional: true dtype: double shape: - nodes @@ -108,6 +109,7 @@ blocks: type: array longname: bottom elevation for the one-dimensional cell description: bottom elevation for the one-dimensional cell. + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.json index 1551d634..a2cba42c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.json @@ -98,17 +98,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.toml index 03373d30..c89c8397 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.toml @@ -88,16 +88,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.yaml index e615af5d..f151bf38 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.yaml @@ -81,14 +81,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.json index 089cdaba..1a166b2e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.json @@ -80,17 +80,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.toml index 673872f5..f0a6c0f5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.toml @@ -72,16 +72,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.temperatureprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.temperatureprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.temperatureprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.yaml index c03f2b25..22e39d75 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.yaml @@ -67,14 +67,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.json index 8b730454..81999035 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.json @@ -187,6 +187,7 @@ "type": "array", "longname": "confined or convertible indicator", "description": "flag for each cell that specifies how saturated thickness is treated. 0 means saturated thickness is held constant; $>$0 means saturated thickness varies with computed head when head is below the cell top; $<$0 means saturated thickness varies with computed head unless the THICKSTRT option is in effect. When THICKSTRT is in effect, a negative value for ICELLTYPE indicates that the saturated thickness value used in conductance calculations in the NPF Package will be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one.", + "optional": true, "default": 0, "netcdf": true, "dtype": "integer", @@ -199,6 +200,7 @@ "type": "array", "longname": "hydraulic conductivity (L/T)", "description": "is the hydraulic conductivity. For the common case in which the user would like to specify the horizontal hydraulic conductivity and the vertical hydraulic conductivity, then K should be assigned as the horizontal hydraulic conductivity, K33 should be assigned as the vertical hydraulic conductivity, and K22 and the three rotation angles should not be specified. When more sophisticated anisotropy is required, then K corresponds to the K11 hydraulic conductivity axis. All included cells (IDOMAIN $>$ 0) must have a K value greater than zero.", + "optional": true, "default": 1.0, "netcdf": true, "dtype": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.toml index 2ee1d616..fca5b6dd 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.toml @@ -172,6 +172,7 @@ developmode = true type = "array" longname = "confined or convertible indicator" description = "flag for each cell that specifies how saturated thickness is treated. 0 means saturated thickness is held constant; $>$0 means saturated thickness varies with computed head when head is below the cell top; $<$0 means saturated thickness varies with computed head unless the THICKSTRT option is in effect. When THICKSTRT is in effect, a negative value for ICELLTYPE indicates that the saturated thickness value used in conductance calculations in the NPF Package will be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one." +optional = true default = 0 netcdf = true dtype = "integer" @@ -184,6 +185,7 @@ shape = [ type = "array" longname = "hydraulic conductivity (L/T)" description = "is the hydraulic conductivity. For the common case in which the user would like to specify the horizontal hydraulic conductivity and the vertical hydraulic conductivity, then K should be assigned as the horizontal hydraulic conductivity, K33 should be assigned as the vertical hydraulic conductivity, and K22 and the three rotation angles should not be specified. When more sophisticated anisotropy is required, then K corresponds to the K11 hydraulic conductivity axis. All included cells (IDOMAIN $>$ 0) must have a K value greater than zero." +optional = true default = 1.0 netcdf = true dtype = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.yaml index 2a8aab93..b0c4ce4c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-npf.yaml @@ -228,6 +228,7 @@ blocks: be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one. + optional: true default: 0 netcdf: true dtype: integer @@ -243,6 +244,7 @@ blocks: vertical hydraulic conductivity, and K22 and the three rotation angles should not be specified. When more sophisticated anisotropy is required, then K corresponds to the K11 hydraulic conductivity axis. All included cells (IDOMAIN $>$ 0) must have a K value greater than zero. + optional: true default: 1.0 netcdf: true dtype: double diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.json index 12ff22f0..6b9ee4e7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.json @@ -80,17 +80,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.toml index 40422bfd..4a7e0980 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.toml @@ -72,16 +72,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.headprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.headprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.headprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.yaml index 1d3cc8a1..51e223f3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.yaml @@ -67,14 +67,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.json index 2f63b264..fde2b128 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.json @@ -110,17 +110,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.toml index ef3dd46a..5bbba0b1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.toml @@ -102,16 +102,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.cimprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.cimprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.cimprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.yaml index b5cb6193..7bf04404 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.yaml @@ -103,14 +103,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.json index 9759163a..1902ab42 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.json @@ -80,17 +80,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.toml index ce81cee0..ecc64ac7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.toml @@ -72,16 +72,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.concentrationprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.concentrationprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.concentrationprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.yaml index 1cbfa031..bf943bbf 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.yaml @@ -67,14 +67,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json index 1bfd262d..bcfe40b5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json @@ -81,6 +81,7 @@ "type": "array", "longname": "mannings roughness coefficient", "description": "mannings roughness coefficient", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml index 3b6d3186..38b963c4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml @@ -72,6 +72,7 @@ developmode = true type = "array" longname = "mannings roughness coefficient" description = "mannings roughness coefficient" +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml index e705fcb0..1d651725 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml @@ -90,6 +90,7 @@ blocks: type: array longname: mannings roughness coefficient description: mannings roughness coefficient + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json index b4340505..54392820 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json @@ -105,6 +105,7 @@ "type": "array", "longname": "length", "description": "length for each one-dimensional cell", + "optional": true, "dtype": "double", "shape": [ "nodes" @@ -114,6 +115,7 @@ "type": "array", "longname": "width", "description": "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values.", + "optional": true, "dtype": "double", "shape": [ "nodes" @@ -123,6 +125,7 @@ "type": "array", "longname": "bottom elevation for the one-dimensional cell", "description": "bottom elevation for the one-dimensional cell.", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml index c9db8ca2..46578931 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml @@ -90,6 +90,7 @@ optional = true type = "array" longname = "length" description = "length for each one-dimensional cell" +optional = true dtype = "double" shape = [ "nodes", @@ -99,6 +100,7 @@ shape = [ type = "array" longname = "width" description = "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values." +optional = true dtype = "double" shape = [ "nodes", @@ -108,6 +110,7 @@ shape = [ type = "array" longname = "bottom elevation for the one-dimensional cell" description = "bottom elevation for the one-dimensional cell." +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml index be77e4a3..61389eff 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml @@ -99,6 +99,7 @@ blocks: type: array longname: length description: length for each one-dimensional cell + optional: true dtype: double shape: - nodes @@ -108,6 +109,7 @@ blocks: description: real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values. + optional: true dtype: double shape: - nodes @@ -115,6 +117,7 @@ blocks: type: array longname: bottom elevation for the one-dimensional cell description: bottom elevation for the one-dimensional cell. + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.json index 46f7ca9b..625af0ae 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.json @@ -98,17 +98,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.toml index 1c41a1cc..564566b0 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.toml @@ -88,16 +88,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.yaml index 0482420c..2379db55 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.yaml @@ -81,14 +81,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.json index 45348c93..603425c9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.json @@ -68,6 +68,7 @@ "type": "string", "longname": "name of tdis input file", "description": "is the name of the Temporal Discretization (TDIS) Input File.", + "optional": true, "case_sensitive": true } } @@ -78,6 +79,7 @@ "type": "list", "longname": "list of models", "description": "is the list of model types, model name files, and model names.", + "optional": true, "item": { "type": "record", "description": "is the record of model types, model name files, and model names.", @@ -112,6 +114,7 @@ "type": "list", "longname": "list of exchanges", "description": "is the list of exchange types, exchange files, and model names.", + "optional": true, "item": { "type": "record", "description": "is the record of exchange types, exchange files, and model names.", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.toml index fefdb06c..4f94445e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.toml @@ -59,12 +59,14 @@ direction = "in" type = "string" longname = "name of tdis input file" description = "is the name of the Temporal Discretization (TDIS) Input File." +optional = true case_sensitive = true [blocks.models.fields.models] type = "list" longname = "list of models" description = "is the list of model types, model name files, and model names." +optional = true [blocks.models.fields.models.item] type = "record" @@ -93,6 +95,7 @@ tagged = false type = "list" longname = "list of exchanges" description = "is the list of exchange types, exchange files, and model names." +optional = true [blocks.exchanges.fields.exchanges.item] type = "record" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.yaml index a7a02493..5008491c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/sim-nam.yaml @@ -67,6 +67,7 @@ blocks: type: string longname: name of tdis input file description: is the name of the Temporal Discretization (TDIS) Input File. + optional: true case_sensitive: true models: fields: @@ -74,6 +75,7 @@ blocks: type: list longname: list of models description: is the list of model types, model name files, and model names. + optional: true item: type: record description: is the record of model types, model name files, and model names. @@ -102,6 +104,7 @@ blocks: type: list longname: list of exchanges description: is the list of exchange types, exchange files, and model names. + optional: true item: type: record description: is the record of exchange types, exchange files, and model names. diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json index 5c7d6ec8..8ecf1543 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json @@ -81,6 +81,7 @@ "type": "array", "longname": "mannings roughness coefficient", "description": "mannings roughness coefficient", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml index a0dc1a50..a09e3d70 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml @@ -72,6 +72,7 @@ developmode = true type = "array" longname = "mannings roughness coefficient" description = "mannings roughness coefficient" +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml index 57d8d347..df1d10cb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml @@ -90,6 +90,7 @@ blocks: type: array longname: mannings roughness coefficient description: mannings roughness coefficient + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json index 63265483..5ccef031 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json @@ -105,6 +105,7 @@ "type": "array", "longname": "width", "description": "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values.", + "optional": true, "dtype": "double", "shape": [ "nodes" @@ -114,6 +115,7 @@ "type": "array", "longname": "bottom elevation for the one-dimensional cell", "description": "bottom elevation for the one-dimensional cell.", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml index 06f11f4f..ed4de5ea 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml @@ -90,6 +90,7 @@ optional = true type = "array" longname = "width" description = "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values." +optional = true dtype = "double" shape = [ "nodes", @@ -99,6 +100,7 @@ shape = [ type = "array" longname = "bottom elevation for the one-dimensional cell" description = "bottom elevation for the one-dimensional cell." +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml index 2a8b9d5d..97c8abd7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml @@ -101,6 +101,7 @@ blocks: description: real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values. + optional: true dtype: double shape: - nodes @@ -108,6 +109,7 @@ blocks: type: array longname: bottom elevation for the one-dimensional cell description: bottom elevation for the one-dimensional cell. + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.json index 156cd2e5..06334f5e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.json @@ -98,17 +98,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.toml index c7f5b810..182cb266 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.toml @@ -88,16 +88,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.yaml index ff05a2e5..65bc3496 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-oc.yaml @@ -81,14 +81,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json index 7ac429ef..7dfefc6d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json @@ -86,6 +86,7 @@ "type": "array", "longname": "mannings roughness coefficient", "description": "mannings roughness coefficient", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml index 074d7bb4..541ef12f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml @@ -75,6 +75,7 @@ developmode = true type = "array" longname = "mannings roughness coefficient" description = "mannings roughness coefficient" +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml index 081a6e59..799d8fef 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml @@ -93,6 +93,7 @@ blocks: type: array longname: mannings roughness coefficient description: mannings roughness coefficient + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json index f9fbc782..4dc2b0a2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json @@ -105,6 +105,7 @@ "type": "array", "longname": "width", "description": "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values.", + "optional": true, "dtype": "double", "shape": [ "nodes" @@ -114,6 +115,7 @@ "type": "array", "longname": "bottom elevation for the one-dimensional cell", "description": "bottom elevation for the one-dimensional cell.", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml index c9a5c2b2..69ae1342 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml @@ -90,6 +90,7 @@ optional = true type = "array" longname = "width" description = "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values." +optional = true dtype = "double" shape = [ "nodes", @@ -99,6 +100,7 @@ shape = [ type = "array" longname = "bottom elevation for the one-dimensional cell" description = "bottom elevation for the one-dimensional cell." +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml index e7db1da9..eba0b2f4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml @@ -101,6 +101,7 @@ blocks: description: real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values. + optional: true dtype: double shape: - nodes @@ -108,6 +109,7 @@ blocks: type: array longname: bottom elevation for the one-dimensional cell description: bottom elevation for the one-dimensional cell. + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.json index 1cb60622..d278b22a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.json @@ -98,17 +98,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.toml index dac07aa4..482fe660 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.toml @@ -88,16 +88,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.yaml index 7d282e77..2174c041 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.yaml @@ -81,14 +81,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.json index 1fdd7e50..3d754e79 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.json @@ -80,17 +80,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.toml index c43d7b12..3f28f92f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.toml @@ -72,16 +72,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.temperatureprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.temperatureprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.temperatureprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.yaml index fd31cdf5..ef02e701 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.yaml @@ -67,14 +67,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.json index 6a1746f8..201b1e88 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.json @@ -195,6 +195,7 @@ "type": "array", "longname": "confined or convertible indicator", "description": "flag for each cell that specifies how saturated thickness is treated. 0 means saturated thickness is held constant; $>$0 means saturated thickness varies with computed head when head is below the cell top; $<$0 means saturated thickness varies with computed head unless the THICKSTRT option is in effect. When THICKSTRT is in effect, a negative value for ICELLTYPE indicates that the saturated thickness value used in conductance calculations in the NPF Package will be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one.", + "optional": true, "default": 0, "netcdf": true, "dtype": "integer", @@ -207,6 +208,7 @@ "type": "array", "longname": "hydraulic conductivity (L/T)", "description": "is the hydraulic conductivity. For the common case in which the user would like to specify the horizontal hydraulic conductivity and the vertical hydraulic conductivity, then K should be assigned as the horizontal hydraulic conductivity, K33 should be assigned as the vertical hydraulic conductivity, and K22 and the three rotation angles should not be specified. When more sophisticated anisotropy is required, then K corresponds to the K11 hydraulic conductivity axis. All included cells (IDOMAIN $>$ 0) must have a K value greater than zero.", + "optional": true, "default": 1.0, "netcdf": true, "dtype": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.toml index 6fb54828..52d8a613 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.toml @@ -178,6 +178,7 @@ developmode = true type = "array" longname = "confined or convertible indicator" description = "flag for each cell that specifies how saturated thickness is treated. 0 means saturated thickness is held constant; $>$0 means saturated thickness varies with computed head when head is below the cell top; $<$0 means saturated thickness varies with computed head unless the THICKSTRT option is in effect. When THICKSTRT is in effect, a negative value for ICELLTYPE indicates that the saturated thickness value used in conductance calculations in the NPF Package will be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one." +optional = true default = 0 netcdf = true dtype = "integer" @@ -190,6 +191,7 @@ shape = [ type = "array" longname = "hydraulic conductivity (L/T)" description = "is the hydraulic conductivity. For the common case in which the user would like to specify the horizontal hydraulic conductivity and the vertical hydraulic conductivity, then K should be assigned as the horizontal hydraulic conductivity, K33 should be assigned as the vertical hydraulic conductivity, and K22 and the three rotation angles should not be specified. When more sophisticated anisotropy is required, then K corresponds to the K11 hydraulic conductivity axis. All included cells (IDOMAIN $>$ 0) must have a K value greater than zero." +optional = true default = 1.0 netcdf = true dtype = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.yaml index d183a09a..182ed1d1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-npf.yaml @@ -233,6 +233,7 @@ blocks: be computed as STRT-BOT and held constant. If the THICKSTRT option is not in effect, then negative values provided by the user for ICELLTYPE are automatically reassigned by the program to a value of one. + optional: true default: 0 netcdf: true dtype: integer @@ -248,6 +249,7 @@ blocks: vertical hydraulic conductivity, and K22 and the three rotation angles should not be specified. When more sophisticated anisotropy is required, then K corresponds to the K11 hydraulic conductivity axis. All included cells (IDOMAIN $>$ 0) must have a K value greater than zero. + optional: true default: 1.0 netcdf: true dtype: double diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.json index 92f02313..c578b24a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.json @@ -80,17 +80,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.toml index 0e2732bd..5da69214 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.toml @@ -72,16 +72,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.headprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.headprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.headprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.yaml index 52eec131..e7769a4b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.yaml @@ -67,14 +67,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.json index 2ef806e5..26e0510a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.json @@ -115,17 +115,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.toml index 2c7dce40..38d47ea3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.toml @@ -105,16 +105,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.cimprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.cimprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.cimprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.yaml index e409914a..d1941cce 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.yaml @@ -106,14 +106,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.json index dd4133bc..d7f22e3f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.json @@ -80,17 +80,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.toml index cccfd4df..61fd5732 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.toml @@ -72,16 +72,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.concentrationprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.concentrationprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.concentrationprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.yaml index 12f7b2f1..7e9a440a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.yaml @@ -67,14 +67,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json index d53e9f3a..cd24e65c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json @@ -86,6 +86,7 @@ "type": "array", "longname": "mannings roughness coefficient", "description": "mannings roughness coefficient", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml index 48c512e9..cdee7ebb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml @@ -75,6 +75,7 @@ developmode = true type = "array" longname = "mannings roughness coefficient" description = "mannings roughness coefficient" +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml index ace64bb8..cd864a46 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml @@ -93,6 +93,7 @@ blocks: type: array longname: mannings roughness coefficient description: mannings roughness coefficient + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json index 864a5948..c02510d3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json @@ -105,6 +105,7 @@ "type": "array", "longname": "length", "description": "length for each one-dimensional cell", + "optional": true, "dtype": "double", "shape": [ "nodes" @@ -114,6 +115,7 @@ "type": "array", "longname": "width", "description": "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values.", + "optional": true, "dtype": "double", "shape": [ "nodes" @@ -123,6 +125,7 @@ "type": "array", "longname": "bottom elevation for the one-dimensional cell", "description": "bottom elevation for the one-dimensional cell.", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml index 45007456..48192ad4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml @@ -90,6 +90,7 @@ optional = true type = "array" longname = "length" description = "length for each one-dimensional cell" +optional = true dtype = "double" shape = [ "nodes", @@ -99,6 +100,7 @@ shape = [ type = "array" longname = "width" description = "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values." +optional = true dtype = "double" shape = [ "nodes", @@ -108,6 +110,7 @@ shape = [ type = "array" longname = "bottom elevation for the one-dimensional cell" description = "bottom elevation for the one-dimensional cell." +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml index 29a595b4..c834f5ee 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml @@ -99,6 +99,7 @@ blocks: type: array longname: length description: length for each one-dimensional cell + optional: true dtype: double shape: - nodes @@ -108,6 +109,7 @@ blocks: description: real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values. + optional: true dtype: double shape: - nodes @@ -115,6 +117,7 @@ blocks: type: array longname: bottom elevation for the one-dimensional cell description: bottom elevation for the one-dimensional cell. + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.json index b089e94b..63aa2ba1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.json @@ -98,17 +98,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.toml index ab008992..ca90b4bd 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.toml @@ -88,16 +88,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.yaml index de8858a6..ee6c61b7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.yaml @@ -81,14 +81,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.json index c3026c37..5ac56e7f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.json @@ -68,6 +68,7 @@ "type": "string", "longname": "name of tdis input file", "description": "is the name of the Temporal Discretization (TDIS) Input File.", + "optional": true, "case_sensitive": true } } @@ -78,6 +79,7 @@ "type": "list", "longname": "list of models", "description": "is the list of model types, model name files, and model names.", + "optional": true, "item": { "type": "record", "description": "is the record of model types, model name files, and model names.", @@ -112,6 +114,7 @@ "type": "list", "longname": "list of exchanges", "description": "is the list of exchange types, exchange files, and model names.", + "optional": true, "item": { "type": "record", "description": "is the record of exchange types, exchange files, and model names.", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.toml index 94a98d8c..7f45397f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.toml @@ -59,12 +59,14 @@ direction = "in" type = "string" longname = "name of tdis input file" description = "is the name of the Temporal Discretization (TDIS) Input File." +optional = true case_sensitive = true [blocks.models.fields.models] type = "list" longname = "list of models" description = "is the list of model types, model name files, and model names." +optional = true [blocks.models.fields.models.item] type = "record" @@ -93,6 +95,7 @@ tagged = false type = "list" longname = "list of exchanges" description = "is the list of exchange types, exchange files, and model names." +optional = true [blocks.exchanges.fields.exchanges.item] type = "record" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.yaml index 922aa4c2..e16eb060 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/sim-nam.yaml @@ -67,6 +67,7 @@ blocks: type: string longname: name of tdis input file description: is the name of the Temporal Discretization (TDIS) Input File. + optional: true case_sensitive: true models: fields: @@ -74,6 +75,7 @@ blocks: type: list longname: list of models description: is the list of model types, model name files, and model names. + optional: true item: type: record description: is the record of model types, model name files, and model names. @@ -102,6 +104,7 @@ blocks: type: list longname: list of exchanges description: is the list of exchange types, exchange files, and model names. + optional: true item: type: record description: is the record of exchange types, exchange files, and model names. diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json index c647e3f4..c72fda94 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json @@ -86,6 +86,7 @@ "type": "array", "longname": "mannings roughness coefficient", "description": "mannings roughness coefficient", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml index b78365a1..5833be7b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml @@ -75,6 +75,7 @@ developmode = true type = "array" longname = "mannings roughness coefficient" description = "mannings roughness coefficient" +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml index 062a1c56..43cfa2b2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml @@ -93,6 +93,7 @@ blocks: type: array longname: mannings roughness coefficient description: mannings roughness coefficient + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json index 557b5877..3606da5c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json @@ -105,6 +105,7 @@ "type": "array", "longname": "width", "description": "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values.", + "optional": true, "dtype": "double", "shape": [ "nodes" @@ -114,6 +115,7 @@ "type": "array", "longname": "bottom elevation for the one-dimensional cell", "description": "bottom elevation for the one-dimensional cell.", + "optional": true, "dtype": "double", "shape": [ "nodes" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml index c6e36d78..7bf0ec79 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml @@ -90,6 +90,7 @@ optional = true type = "array" longname = "width" description = "real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values." +optional = true dtype = "double" shape = [ "nodes", @@ -99,6 +100,7 @@ shape = [ type = "array" longname = "bottom elevation for the one-dimensional cell" description = "bottom elevation for the one-dimensional cell." +optional = true dtype = "double" shape = [ "nodes", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml index f35eaf46..b6d002f4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml @@ -101,6 +101,7 @@ blocks: description: real value that defines the width for each one-dimensional cell. WIDTH must be greater than zero. If the Cross Section (CXS) Package is used, then the WIDTH value will be multiplied by the specified cross section x-fraction values. + optional: true dtype: double shape: - nodes @@ -108,6 +109,7 @@ blocks: type: array longname: bottom elevation for the one-dimensional cell description: bottom elevation for the one-dimensional cell. + optional: true dtype: double shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.json index 299be678..bc58356f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.json @@ -98,17 +98,20 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data." + "description": "number of columns for writing data.", + "optional": true }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number." + "description": "width for writing each number.", + "optional": true }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number." + "description": "number of digits to use for writing a number.", + "optional": true }, "format": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.toml index 199d9655..e3657e5f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.toml @@ -88,16 +88,19 @@ type = "record" type = "integer" longname = "number of columns" description = "number of columns for writing data." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.width] type = "integer" longname = "width for each number" description = "width for writing each number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.digits] type = "integer" longname = "number of digits" description = "number of digits to use for writing a number." +optional = true [blocks.options.fields.qoutflowprintrecord.fields.formatrecord.fields.format] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.yaml index 27321978..0c7fb591 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-oc.yaml @@ -81,14 +81,17 @@ blocks: type: integer longname: number of columns description: number of columns for writing data. + optional: true width: type: integer longname: width for each number description: width for writing each number. + optional: true digits: type: integer longname: number of digits description: number of digits to use for writing a number. + optional: true format: type: string longname: write format diff --git a/autotest/dfns/test_schema.py b/autotest/dfns/test_schema.py index 279c5681..d361adb2 100644 --- a/autotest/dfns/test_schema.py +++ b/autotest/dfns/test_schema.py @@ -343,7 +343,9 @@ def test_memory_output_attributes_rcha(dev3_spec): def test_render_respects_tagged_scalars_in_record(dev3_spec): """Tagged Integer/String subfields of a Record must keep their keyword on render().""" render = dev3_spec.components["gwf-oc"].blocks["options"].render() - assert "HEAD PRINT_FORMAT COLUMNS WIDTH DIGITS " in render + # columns/width/digits are optional per v1's bare `optional` attribute on each + # (see try_parse_bool's empty-string handling), so they render bracketed. + assert "HEAD PRINT_FORMAT [COLUMNS ] [WIDTH ] [DIGITS ] " in render def test_render_respects_untagged_arrays_in_record(dev3_spec): diff --git a/modflow_devtools/misc.py b/modflow_devtools/misc.py index e034c938..a1cc1573 100644 --- a/modflow_devtools/misc.py +++ b/modflow_devtools/misc.py @@ -580,13 +580,22 @@ def try_literal_eval(value: str) -> Any: def try_parse_bool(v: Any, default: bool = False) -> bool: - """Try to parse a boolean from a string.""" + """ + Try to parse a boolean from a string. + + An empty string is treated as ``True`` rather than ``False``: DFN files + allow a bare attribute line with no value (e.g. ``optional`` on its own + line, as opposed to ``optional true``/``optional false``) to mean the + attribute is set. ``load_dfn`` parses such a line to an empty string, as + distinct from ``None``, which indicates the attribute wasn't present at + all (and falls through to ``default``). + """ if isinstance(v, bool): return v if isinstance(v, str): s = v.strip().lower() - if s == "true": + if s in ("true", ""): return True - if s in ("false", ""): + if s == "false": return False return default From d638211cfb73c4f90964a956dc6094efa6a7d057 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Aug 2026 07:42:28 -0700 Subject: [PATCH 02/11] fix(dfns): remove unused Array.repeat attribute Array.repeat was added in the v2 schema rewrite (#311) as a `str | None` field-name reference, replacing v1's plain `repeating: bool`, but the migration was never wired up to populate it, and the spec's promised elaboration ("See `repeat` section below") was never written -- no such section exists. Checked what the 3 real corpus fields with v1 `repeating: true` (utl-tas.tas_array, prt-oc.times, prt-prp.times) would even reference: all 3 also have v1 `shape (any1d)`, which the mapper already collapses to `shape=[]` (self-sizing), matching dfnspec.md's existing self-sizing semantics exactly. None has a sibling field to point to as a count source, so the reference design never matched real data. Removing rather than backfilling a migration for an attribute nothing consumes and no data supports. Co-Authored-By: Claude Sonnet 5 --- docs/md/dfnspec.md | 5 ----- modflow_devtools/dfns/schema.json | 12 ------------ modflow_devtools/dfns/schema.py | 1 - 3 files changed, 18 deletions(-) diff --git a/docs/md/dfnspec.md b/docs/md/dfnspec.md index 9146a805..0b9deef8 100644 --- a/docs/md/dfnspec.md +++ b/docs/md/dfnspec.md @@ -68,7 +68,6 @@ This document describes the MODFLOW 6 component definition (DFN) system. This sy - [`dtype`](#dtype) - [`shape`](#shape) - [`time_series`](#time_series-3) - - [`repeat`](#repeat) - [Record](#record) - [Type-specific attributes](#type-specific-attributes-7) - [`fields`](#fields-2) @@ -439,10 +438,6 @@ A 1D array appearing as a subfield of a record is called an **inline array**. In `boolean (default: false)`. Marks fields where the READARRAY invocation may be replaced by a TAS name referencing a `utl-tas` time-array series object. At any model time, the TAS provides an interpolated grid-shaped array. Distinct from the scalar case: references `utl-tas`, not `utl-ts`. Note that `utl-tas` currently only works with layered arrays, not full-grid arrays, though generalizing has been considered. -###### `repeat` - -`string | null (default: null)`. Names the field (within the same component) whose runtime length determines how many times this field is read sequentially within an array block, with each reading appended to an accumulated sequence. See `repeat` section below. - #### Record Type `record`. Product type. In MF6 input files, records appear on a single line. Record subfields may or may not be `tagged`. While blocks can be considered product types also, in the DFN specification only records are considered fields; blocks are considered named collections of related fields. diff --git a/modflow_devtools/dfns/schema.json b/modflow_devtools/dfns/schema.json index 60237a85..cc043a2a 100644 --- a/modflow_devtools/dfns/schema.json +++ b/modflow_devtools/dfns/schema.json @@ -92,18 +92,6 @@ "default": false, "title": "Time Series", "type": "boolean" - }, - "repeat": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Repeat" } }, "required": [ diff --git a/modflow_devtools/dfns/schema.py b/modflow_devtools/dfns/schema.py index 0d446cd4..c4334b11 100644 --- a/modflow_devtools/dfns/schema.py +++ b/modflow_devtools/dfns/schema.py @@ -122,7 +122,6 @@ class Array(FieldBase): shape: list[str] = [] time_series: bool = False layered: bool = False - repeat: str | None = None class Record(FieldBase): From 30c0d67017f657a076929e9ae61a46ee863d1e7c Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Aug 2026 07:42:41 -0700 Subject: [PATCH 03/11] fix(dfns): fix lonely-pk block/field name matching, reorder past LAK fixup _mark_lonely_pk matched a block's list field by the *block's own* name (gated to a "packagedata"/"perioddata" allowlist), but MF6's convention names the block "period" and its list field "perioddata" -- the two are never the same string, so the "perioddata" entry in the allowlist could never match any component. Fixed by matching on the list field's own name instead (_LONELY_PK_FIELDS). Confirmed via corpus scan: this was dead for every package, not just the gwf-mvr case the old docstring called out; utl-spc.bndno is the first real catch. This also required moving _mark_lonely_pk's call to after _fix_lak_relations/_fix_mvr_relations: LAK's period `number` field (the deliberately-ambiguous lake-or-outlet field split by _fix_lak_relations) structurally looks exactly like a lonely pk before that split runs, and _fix_lak_relations builds its lakeno/outletno fk copies via number_field.model_copy(...), which would carry a stale pk=True into fields that are actually foreign keys. Verified no other pass between the old and new call sites reads pk/fk state. Co-Authored-By: Claude Sonnet 5 --- .../__snapshots__/v2.0.0.dev2/utl-spc.json | 3 +- .../__snapshots__/v2.0.0.dev2/utl-spc.toml | 1 + .../__snapshots__/v2.0.0.dev2/utl-spc.yaml | 1 + .../__snapshots__/v2.0.0.dev3/utl-spc.json | 3 +- .../__snapshots__/v2.0.0.dev3/utl-spc.toml | 1 + .../__snapshots__/v2.0.0.dev3/utl-spc.yaml | 1 + .../dfns/migrate_to_v2_0_0_dev2.py | 46 +++++++++++++------ 7 files changed, 39 insertions(+), 17 deletions(-) diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.json index 9762bffe..cc864a4e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.json @@ -60,7 +60,8 @@ "type": "integer", "longname": "bound number for this entry", "description": "integer value that defines the boundary package feature number associated with the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND.", - "tagged": false + "tagged": false, + "pk": true }, "spcsetting": { "type": "union", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.toml index 5605d3e2..2f96107a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.toml @@ -50,6 +50,7 @@ type = "integer" longname = "bound number for this entry" description = "integer value that defines the boundary package feature number associated with the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND." tagged = false +pk = true [blocks.period.fields.perioddata.item.fields.spcsetting] type = "union" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.yaml index ce53abf0..8e442053 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.yaml @@ -54,6 +54,7 @@ blocks: the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND. tagged: false + pk: true spcsetting: type: union description: 'line of information that is parsed into a keyword and values. Keyword values diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.json index d3c21980..636b9d89 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.json @@ -60,7 +60,8 @@ "type": "integer", "longname": "bound number for this entry", "description": "integer value that defines the boundary package feature number associated with the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND.", - "tagged": false + "tagged": false, + "pk": true }, "spcsetting": { "type": "union", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.toml index d4f4d852..77767aa1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.toml @@ -50,6 +50,7 @@ type = "integer" longname = "bound number for this entry" description = "integer value that defines the boundary package feature number associated with the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND." tagged = false +pk = true [blocks.period.fields.perioddata.item.fields.spcsetting] type = "union" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.yaml index 3f0816ff..ffc94882 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.yaml @@ -54,6 +54,7 @@ blocks: the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND. tagged: false + pk: true spcsetting: type: union description: 'line of information that is parsed into a keyword and values. Keyword values diff --git a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py index 5f2dca94..456e60a7 100644 --- a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py +++ b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py @@ -375,31 +375,40 @@ def _resolve_record(record: v2.Record) -> v2.Record: } -_LONELY_PK_BLOCKS = ("packagedata", "perioddata") +_LONELY_PK_FIELDS = ("packagedata", "perioddata") def _mark_lonely_pk(blocks: dict[str, v2.Block]) -> dict[str, v2.Block]: """ - Mark the leading identifier column of a self-titled ``packagedata`` or - ``perioddata`` recarray as ``pk`` even when nothing else in the component - names the same field, so ``_resolve_relations``'s cross-block signal - never fires (e.g. BUY's ``irhospec``, CSUB's ``icsubno``, ATS's - ``iperats``). These are still genuine row identifiers by construction + Mark the leading identifier column of a ``packagedata`` or ``perioddata`` + recarray as ``pk`` even when nothing else in the component names the same + field, so ``_resolve_relations``'s cross-block signal never fires (e.g. + BUY's ``irhospec``, CSUB's ``icsubno``, ATS's ``iperats``, SPC's + ``bndno``). These are still genuine row identifiers by construction (MODFLOW rejects a repeated one) — they're just never referenced by name anywhere else in their own component, unlike SFR/MAW/LAK/UZF's `ifno` columns, which repeat across multiple blocks. - Conservative by design: only fires on a block literally named - ``packagedata``/``perioddata`` whose same-named list field's item record + Matches on the *list field's* name, not the enclosing block's. MF6's own + convention names the period block ``period`` but its list field + ``perioddata`` — the two are never the same string, so matching on the + block name (as this used to) silently never fired for the ``perioddata`` + case at all, for any component. + + Conservative by design: only fires when the list field's item record leads with a required Integer column carrying no ``fk`` and no existing ``pk`` anywhere in the record. This deliberately excludes lookalikes like DISU/DISV's ``vertices``/``cell2d`` (row identifiers, but a distinct grid-geometry concern) and the FK side of relations like - ``gwf-mvr.period.perioddata`` (block name doesn't match the list name). + ``gwf-mvr.period.perioddata`` (leads with ``mname1``, a String — not an + Integer identifier at all). """ updated: dict[str, v2.Block] = {} for block_name, block in blocks.items(): - field = block.fields.get(block_name) if block_name in _LONELY_PK_BLOCKS else None + field_name = next((n for n in _LONELY_PK_FIELDS if n in block.fields), None) + if field_name is None: + continue + field = block.fields[field_name] if not isinstance(field, v2.List) or not isinstance(field.item, v2.Record): continue record = field.item @@ -418,7 +427,7 @@ def _mark_lonely_pk(blocks: dict[str, v2.Block]) -> dict[str, v2.Block]: ) new_field = field.model_copy(update={"item": new_record}) updated[block_name] = block.model_copy( - update={"fields": {**block.fields, block_name: new_field}} + update={"fields": {**block.fields, field_name: new_field}} ) return {**blocks, **updated} @@ -877,9 +886,10 @@ def _fix_mvr_relations(name: str, blocks: dict[str, v2.Block]) -> dict[str, v2.B participating in the mover, but nothing else in the component repeats the field name `pname` (the period block's `pname1`/`pname2` are renamed), so neither `_resolve_relations` nor `_mark_lonely_pk` finds - it — the former needs a name match, and the latter's `packages` block - isn't in `_LONELY_PK_BLOCKS`, plus `pname` isn't `packages`' leading - column (`mname` is, and it's optional, so it can't be the pk anyway). + it — the former needs a name match, and the latter only fires on a + `packagedata`/`perioddata` list field, which `packages` isn't, plus + `pname` isn't `packages`' leading column (`mname` is, and it's + optional, so it can't be the pk anyway). - Marks `period.perioddata`'s `pname1`/`pname2` as `fk: "packages.pname"`, since each identifies the provider/receiver package by name. @@ -1420,7 +1430,6 @@ def _lookup(rname: str) -> dict | None: blocks, array_dims = _resolve_dimensions(blocks) blocks = _resolve_relations(blocks) - blocks = _mark_lonely_pk(blocks) raw_dim_names = _raw_dim_names(blocks) blocks = _normalize_n_prefix_shapes(blocks, raw_dim_names) explicit_dims = _build_explicit_dims(parent, blocks) @@ -1434,6 +1443,13 @@ def _lookup(rname: str) -> dict | None: blocks = _patch_oc_rtype(name, blocks) blocks = _fix_lak_relations(name, blocks) blocks = _fix_mvr_relations(name, blocks) + # Must run after `_fix_lak_relations`: LAK's period `number` field looks + # exactly like a lonely pk (leading required Integer, no fk) before it's + # split into per-arm `lakeno`/`outletno` fk's — marking it pk here first + # would carry a stale `pk=True` into those fk copies (`model_copy` off + # the original field). No other pass between the old and new call sites + # reads or depends on `pk`/`fk` state. + blocks = _mark_lonely_pk(blocks) dims = {**explicit_dims, **array_dims, **derived_dims} or None d: dict[str, Any] = { From a4faf13b1d9ac9d04240242bcb486e5d9ecd4737 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Aug 2026 07:42:50 -0700 Subject: [PATCH 04/11] docs(dfns): track devtools-side migration gaps and index/node attribute plan Adds todo.md (working log of the v1->v2 migration gaps found during the flopy4 dev3 migration, including the fixes in this branch and a corpus-scan breakdown of the remaining numeric_index -> pk/fk gap into five structurally distinct sub-issues) and index-node-attributes-plan.md (implementation plan for splitting the pk/fk vocabulary's conflated "needs 1-based/0-based conversion" and "is a relational key" concerns into dedicated `index` and `node` attributes, with a phased sequence and the flopy4-side coordination this requires). Co-Authored-By: Claude Sonnet 5 --- index-node-attributes-plan.md | 119 ++++++++++++++++++++++++++++ todo.md | 143 ++++++++++++++++++++++++++++++++++ 2 files changed, 262 insertions(+) create mode 100644 index-node-attributes-plan.md create mode 100644 todo.md diff --git a/index-node-attributes-plan.md b/index-node-attributes-plan.md new file mode 100644 index 00000000..2c6d6fa7 --- /dev/null +++ b/index-node-attributes-plan.md @@ -0,0 +1,119 @@ +# `index` and `node` attributes: implementation plan + +Working plan for closing devtools gap #2 (`dev3-migration-gaps.md`, `todo.md`) properly, +rather than continuing to stretch `pk`/`fk` to cover cases they don't fit. Context and full +reasoning live in conversation history; this doc is the standalone plan for implementation +and for handing off to flopy4. + +## The core decision + +`pk`/`fk` were being asked to answer two unrelated questions at once: + +1. **Serialization**: does this integer need MF6's 1-based↔0-based translation on read/write? +2. **Relational identity**: does this column identify a row (`pk`), or point at one (`fk`)? + +Evidence this conflation was already broken: flopy4 derives its `is_index`/`role="feature_id"` +conversion trigger from "`pk` or `fk` is set," then had to bolt on an `isinstance(col, Integer)` +guard after a `pk`/`fk` on a String field (MVR's `pname`) crashed `int()` — proof the vocabulary +was carrying a job it was never typed to carry safely. + +Splitting into three orthogonal attributes: + +- **`index`** — pure serialization fact. Doesn't claim uniqueness, doesn't claim to point + anywhere. +- **`node`** — pure "this is a grid-cell reference" fact, resolved via DIS/DISV/DISU geometry + at runtime, not via a schema `pk` lookup. +- **`pk`/`fk`** — unchanged shape, but now *only* mean relational identity (a value that + identifies or points at a list row). No longer required to also signal serialization. + +## `index: bool = False` + +- Valid on: `Integer` scalars (anywhere — list-item column, record subfield, block field), + and `Array` with `dtype: "integer"` (meaning: *the array's elements* are 1-based indices — + covers `icvert`, `ja`, `irch`, `ievt`). +- **Not valid on `String`** — enforced by a schema validator, not just convention. This is the + fix for the exact bug flopy4 patched around; the schema should guarantee it so nobody needs + a defensive `isinstance` check downstream again. +- Migration: **direct copy** from v1's `numeric_index` wherever the field is `Integer` or + `Array(dtype="integer")`. No heuristics, no block-name matching — same mechanical shape as + the existing `layered`/`time_series` migration. String fields with v1 `numeric_index: true` + (`utl-obs.id`/`id2`) get nothing, consistent with the existing conclusion that they're + dynamic/non-numeric, not an oversight. + +## `node: bool = False` + +- Valid on: `Integer` scalars in list-item-column position (same placement `fk` currently + requires). +- Meaning: this value is a grid-cell reference resolved from the parent model's grid at + runtime — a structurally different resolution path than `fk` (geometry lookup, not + pk lookup). +- Replaces the `fk="node"` sentinel. `fk` no longer accepts `"node"` as a value; it always + means "resolves to a `pk` field," full stop. `schema.py`'s fk-structure validator loses its + `fk == "node"` exemption branch and becomes a single-invariant check. +- Migration: **not** part of the direct/mechanical pass — same audit-as-you-go category as + `pk`/`fk` backfill. Known corpus candidates: `exg-chfgwf`/`exg-gwegwe`/`exg-gwfgwf`/ + `exg-gwtgwt`/`exg-olfgwf`'s `cellidm1`/`cellidm2` (6 exchange types), `gwf-gnc`'s + `cellidm`/`cellidn`. + +## `pk`/`fk`: unchanged type, narrowed job + +No schema shape change. `_resolve_relations`/`_mark_lonely_pk` keep working as they do today. +The difference is priority: this is no longer blocking anything (flopy4's conversion need is +served by `index`), so it becomes incremental, best-effort relational-documentation work. +Corpus-identified remaining items, from the earlier scan, each independently schedulable: + +- **Lonely-pk allowlist extension** — same shape `_mark_lonely_pk` already detects, just + outside `_LONELY_PK_FIELDS`: DISU/DISV/DISV1D's `vertices.iv`, `cell2d.icell2d`, + `cell1d.icell1d`; SFR's `diversions.iconr`; MAW's `connectiondata.icon`; UZF's + `packagedata.ivertcon`. No longer controversial for DISU/DISV now that `pk` doesn't need to + "earn its keep" via a matching `fk` — marking it is just honestly documenting a real, + if unreferenced, row identifier. +- **Cross-component fk** — `idcxs`: defining side (`chf-cxs`/`olf-cxs`/`swf-cxs`) already + `pk`'d; referencing side (`chf-dfw`, `chf-cdb`, `chf-zdg`, `olf-dfw`, `olf-zdg`, `swf-dfw`, + `swf-zdg`) needs `fk`. Requires a pass that can see across component boundaries — + `_resolve_relations` currently can't. +- **Compound-scoped fields, now with an honest answer** — SFR `diversions.idv` gets `index` + only (correctly — it's not globally unique, so it was never a valid `pk`). `diversions.iconr` + gets `fk = "packagedata.ifno"` (a real reference into reaches) alongside `index`. + +## Implementation steps (this repo) + +1. **`schema.py`**: add `index: bool = False` to `Integer` and to `Array` (validator: only + when `dtype == "integer"`); add `node: bool = False` to `Integer`; remove `"node"` from + `fk`'s accepted forms; simplify the fk-structure validator (drop the `node` exemption). +2. **`dfnspec.md`**: document `index` under Integer and Array type-specific attributes; + document `node` under Integer; rewrite the "Primary and foreign keys" section's "Grid cell + sentinel" form out, replacing it with a description of `node` as a distinct attribute. +3. **`schema.json`**: regenerate for the new attributes. (Note: this file was already stale + before this work — missing `removed`/`deprecated`/`layered` on `Array` — so full + regeneration will surface that unrelated drift too; reconcile it in the same pass rather + than hand-editing around it again.) +4. **`migrate_to_v2_0_0_dev2.py`** (or wherever the per-field mapper lives): + - Direct `index` migration: for `Integer` fields and `Array(dtype="integer")` fields, + `index = try_parse_bool(f.get("numeric_index"), False)`. + - New `_mark_node_refs`-style pass, audited per field, for the exchange `cellidm1`/ + `cellidm2` and GNC `cellidm`/`cellidn` cases. +5. `pk`/`fk` extensions (separate, lower-priority commits, any order): lonely-pk allowlist + widening; cross-component `idcxs` pass; SFR `diversions` fk/index split. +6. Update `todo.md` to replace the (a)–(g) bucket list with these concrete, independently + trackable items. +7. Full `autotest/dfns/` suite + snapshot regeneration after each step. + +## What flopy4 needs to change (separate repo, coordinate before/alongside) + +- Switch `is_index`/`role="feature_id"` derivation from "`pk` or `fk` is set, Integer-only" to + reading `index` directly. Drop the defensive `isinstance(col, Integer)` patch — no longer + needed, the schema enforces it now. +- If/when typed grid-cell references are wanted (the deferred "Union-item-class shape" work), + consume `node` instead of checking `fk == "node"`. +- No urgency on the `pk`/`fk` backfill items above — those remain best-effort relational + documentation, not something flopy4 should block on. + +## Sequencing + +- **Phase 1 (now)**: `index` — schema + validator + direct migration. This is the piece that + actually unblocks flopy4 and closes gap #2's practical urgency. Small, mechanical, low-risk. +- **Phase 2 (now, small)**: `node` — schema + validator + `fk="node"` removal + the handful of + exchange/GNC backfills. Well-scoped enough to go in the same pass as Phase 1. +- **Phase 3 (later, incremental, no urgency)**: `pk`/`fk` extensions — lonely-pk allowlist, + cross-component `idcxs`, SFR `diversions` split. diff --git a/todo.md b/todo.md new file mode 100644 index 00000000..51905f18 --- /dev/null +++ b/todo.md @@ -0,0 +1,143 @@ +# Done + +- block.optional derived from fields (any required field → mandatory; all optional → optional) +- block repetition × optionality interaction clarified in spec (2×2 matrix) +- self-sizing arrays: position-based rules replace string-specific rules + - self-sizing (shape=[]) valid at top level and as rightmost record subfield + - non-rightmost record subfield with no shape is a validation error + - any dtype, not just string +- array dimension attribute: valid on any self-sizing array (not string-only) + - dimension sources provide dynamic element count to other arrays' shape expressions +- schema version consistency validated across components in a DfnSpec +- bound-annotated shape expressions (<, >, <=, >=) parsed and validated +- intra-record sibling scope restricted to Integer (Array.dimension="record" removed) +- dfnspec.md updated throughout to reflect all of the above + +# Todo + +## v1 → v2 mapper gaps (now visible from TOML output) + +- [x] period blocks should have `repeats: true` — mapper never sets this on any block +- [x] `auxiliary` (and similar self-sizing string arrays that define a named set) should have + `dimension: "component"` set by the mapper — the v1 DFN shape `(naux)` is the signal + that the array's length defines a dimension used elsewhere +- [x] `model_dump(exclude_none=True)` serializes False boolean defaults verbosely + (developmode, netcdf, time_series, pk, etc.) — replaced with `_to_toml_dict` which + introspects `field_info.default is False` to suppress them without hardcoding names +- [x] single-file v2 conversion in dfn2toml.py skips the v1→v2 mapping step (passes raw + Dfn dataclass to _convert instead of a mapped Component) +- [x] period block list structure: `map_period_block` removed; recarray List structure + preserved as-is from v1 → v2 mapping +- [x] `repeats: true` now derived from `block_variable` attribute on v1 FieldV1 (not + hardcoded to "period"); `solutiongroup` in sim-nam correctly gets `repeats: true` +- [x] arithmetic shape elements (`dim [+-] integer`, e.g. `nseg-1`) added to validator +- stress period list fields should be explicitly marked optional or not in the mapper + (most are optional but some are required) + +## v1 → v2 migration gaps found during flopy4 dev3 migration (2026-08-18) + +- [x] `Array.repeat` was never populated by migration, and turned out not to be needed: + removed instead of fixed. History (see git log on `modflow_devtools/dfns/schema.py`): + pre-#311, the v1→v2 mapping was a loose passthrough (raw v1 field dict, lightly sorted), + so v1's `repeating: true` survived into dev0/dev1 output automatically with no dedicated + code. #311's schema rewrite switched to a strict, fully-typed schema and redesigned + `repeating: bool` into `repeat: str | None` (a reference, not a flag) — but nothing was + ever written to populate it, and `dfnspec.md`'s promised elaboration ("See `repeat` + section below") was a dangling link, then and now. Checked what the 3 real fields with + v1 `repeating true` (`utl-tas.tas_array`, `prt-oc.times`, `prt-prp.times`) would even + reference: all 3 also have v1 `shape (any1d)`, which the mapper already collapses to + `shape=[]` (self-sizing) — matching `dfnspec.md`'s existing self-sizing-array semantics + exactly (MF6 reads values until it runs out). None has a sibling field to point to as a + count source, so the reference design never matched real data. Removed `Array.repeat` + from `schema.py`, `dfnspec.md`, and `schema.json` rather than backfilling a migration for + a field nothing consumes and no data supports. + +- Confirmed *not* a gap, for the record: worried `rtype` (OC `saverecord`/`printrecord` + arms) might not have its valid-value set migrated into `String.valid`, which would have + meant flopy4 couldn't drop its hardcoded `_OC_RTYPES` table. Checked directly — + `rtype.valid` is populated correctly per component (`['HEAD', 'BUDGET']` for gwf-oc, + etc.), sourced from the v1 DFN description text. No migration work needed here. + +- [ ] **`numeric_index` → `pk`/`fk` backfill (a838d84, #337) covered fewer fields than the + v1 corpus actually has flagged.** That fix targeted 6 fields (BUY/CSUB/VSC/PRP/ATS/CXS + self-referential primary keys). A full corpus scan (walking v1 DFNs recursively including + list/record children, matched by field name against dev3's fully-recursed leaf fields — + a flat top-level-only scan finds 0, since most of these live inside `List.item.fields`, + not directly in `Block.fields`) turns up **44** fields with v1 `numeric_index: true` and + no `pk`/`fk` in dev3. Confirmed one causes a real behavioral regression, not just a + metadata gap: `gwf-lak.iconn` (connectiondata's per-lake connection sequence number) needs + the same 0-based-Python/1-based-file conversion `pk`/`fk` columns get; without it, MF6 + rejects the written file (`iconn FOR LAKE 1 MUST BE > 1 and <= 9`) — confirmed by + reproducing the failure, then fixing it with a local flopy4-side `pk = true` override, + which resolved it. flopy4 has only patched `iconn` so far (the one confirmed to break a + real test); the other 43 are unaudited case-by-case but are almost certainly the same + category — most are named like connection/vertex/cell sequence numbers scoped *within* a + parent row rather than unique across their whole table (`icell1d`/`icell2d`/`iv` + (DISU/DISV vertex indices), `icon`/`iconr`/`idv` (MAW/SFR connection numbers, siblings of + `iconn`), `cellidm1`/`cellidm2`/`cellidm`/`cellidn` (exchange cellid refs), `idcxs` + (cross-section id ref), `bndno` (SPC)) — plus `gwf-mvr.id1`/`id2`, which the flopy4-side + corpus audit (namefile-load-plan.md, Phase 0.6a) already separately concluded are + genuinely dynamic/untyped (target package resolved by name at runtime, not a formal FK) so + may not need a schema change at all, just confirmation that `index=True`-equivalent + handling is enough on the consumer side. Given the pattern (numeric_index true, not a + pk/fk match) is the same root cause already identified for the 6-field fix, this reads + like the fix's structural-signal net needs to be wider (or a distinct + "index but not a full pk" concept needs a name), not a new bug — flagging so the full 44 + get audited under the same pass rather than trickling in one flopy4 regression at a time. + +- [x] **Bare (valueless) boolean attribute lines in v1 DFNs migrated as `False` instead of + `True`.** v1 syntax allows a boolean attribute's line to carry no value at all (e.g. a + bare `optional` line, vs. `optional true`/`optional false`), meaning the attribute is set. + `load_dfn` parses such a line to `""` (as opposed to `None` for a wholly absent attribute), + but `try_parse_bool("", default)` unconditionally returned `False` regardless of `default`, + silently inverting the flag. Not `optional`-specific: any boolean attribute using this v1 + convention was affected (confirmed `tagged` also uses bare lines in the real corpus, 23 + occurrences across 18 files, though none happened to change rendered output this pass). + Fixed at the root in `try_parse_bool` (`modflow_devtools/misc.py`) rather than patching call + sites individually. Real-corpus impact turned out wider than originally scoped: beyond the + 6 known `*-oc`/`gwt-ist` printrecord files, `chf-dfw`, `chf-disv1d`, `gwf-npf`, `olf-dfw`, + `olf-disv1d`, `swf-dfw`, `swf-disv1d`, and `sim-nam` also had real bare-`optional` fields + that are now correctly migrated as optional. One existing test + (`test_render_respects_tagged_scalars_in_record`) had baked in the old (buggy) rendering of + `gwf-oc`'s `columns`/`width`/`digits` as required; updated to expect them bracketed as + optional, matching flopy4's independently-confirmed real MF6 behavior for the same fields. + +- Gap #2 (`numeric_index` → `pk`/`fk`, above) decomposed into concrete sub-issues after a + recursive scan against the real corpus (52 components, 98 `numeric_index: true` + occurrences). Not one bug — five different things producing the same symptom: + - [x] **(c) `_LONELY_PK_BLOCKS`/`_mark_lonely_pk` matched on the wrong name.** MF6's + convention is block `period` + list field `perioddata` (never the same string), so the + `"perioddata"` entry in the allowlist could never match *any* component — dead since + a838d84. Fixed by matching on the list field's own name instead of the enclosing block's + (`_LONELY_PK_FIELDS`, `migrate_to_v2_0_0_dev2.py`). Caught `utl-spc.bndno`. Also had to + move `_mark_lonely_pk`'s call to *after* `_fix_lak_relations`/`_fix_mvr_relations` in the + pipeline: LAK's period `number` field (the deliberately-ambiguous lake-or-outlet field — + see `_fix_lak_relations`'s docstring) structurally looks exactly like a lonely pk before + `_fix_lak_relations` splits it into per-arm `lakeno`/`outletno` fk's; marking it pk first + leaked a stale `pk=True` into those fk copies via `model_copy`. Full suite green after the + reorder, only `bndno` changed. + - [ ] **(b) Same lonely-pk shape, blocked by a hardcoded name allowlist.** DISU/DISV/DISV1D's + `vertices.iv`, `cell2d.icell2d`, `cell1d.icell1d` (24 occurrences), SFR's + `diversions.iconr`/`idv`, MAW's `connectiondata.icon`, UZF's `packagedata.ivertcon` are the + same shape `_mark_lonely_pk` already detects, just under block/field names outside + `_LONELY_PK_FIELDS`. The DISU/DISV case is a deliberate exclusion in the current docstring + ("a distinct grid-geometry concern") — open question: is `pk=true` still correct/useful + there even though nothing can carry a matching `fk` back (the only things that reference + vertex/cell numbers, e.g. `icvert`, are Arrays, which can't hold `fk` at all per (a))? + - [ ] **(d) Cross-component FKs unreachable by construction.** `idcxs`: defining side + (`chf-cxs`/`olf-cxs`/`swf-cxs`) already `pk`'d; referencing side (`chf-dfw`, `chf-cdb`, + `chf-zdg`, `olf-dfw`, `olf-zdg`, `swf-dfw`, `swf-zdg`) never gets `fk` set, because + `_resolve_relations` only ever sees one component's own `blocks` dict. Schema already + supports this (`fk = "[component.]block.field"`); migration mapper never attempts it. + - [ ] **(e) `fk = "node"` grid-cell sentinel, unused.** `exg-*.cellidm1`/`cellidm2` (6 + exchange types), `gwf-gnc.cellidm`/`cellidn` look like the schema's existing grid-cell + sentinel case, already speced and validated in `schema.py`, never populated by the mapper. + - [ ] **(a) Array-typed fields can't take `pk`/`fk` at all.** `irch`, `ievt`, `icvert`, `ja`, + `ic`, `cellidsj` are `Array`s; `dfnspec.md` restricts `pk`/`fk` to integer/string columns + in a list item record. v1's `numeric_index` on these likely just means "apply 1-based + conversion," a concept with no home in v2 outside the relational `pk`/`fk` vocabulary. + - [ ] **(f) Compound keys — no concept for them.** SFR's `diversions.iconr`/`idv` are unique + only per-reach, not table-wide; a blind `pk=true` would misrepresent them. `pk`/`fk` as + specced has no compound-key notion. + - [x] **(g) `gwf-mvr.id1`/`id2`, `utl-obs.id`/`id2`** — already independently audited + (dynamic/name-resolved, not a formal FK). Confirmed by this scan too; no work needed. From aa1d7e22cc013314808c7e67b7ce24203dbcdaee Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Aug 2026 13:53:12 -0400 Subject: [PATCH 05/11] feat(dfns): add index attribute (Phase 1 of index/node plan) Splits the numeric_index -> pk/fk gap's serialization concern out of the relational pk/fk vocabulary, per index-node-attributes-plan.md Phase 1. Adds Integer.index and Array.index (dtype="integer" only, enforced by a validator; never valid on String) to schema.py, documents both in dfnspec.md, regenerates schema.json (also picking up pre-existing unrelated drift: removed/deprecated/layered were missing from Array's schema), and migrates index directly from v1 numeric_index in migrate_to_v2_0_0_dev2.py for every Integer/Array(dtype="integer") field. Confirmed this closes the gwf-lak.iconn regression tracked in todo.md (MF6 rejected the file without the 1-based/0-based conversion index=True provides) and coexists correctly with existing pk/fk (e.g. chf-cxs.idcxs keeps pk=true and gains index=true). Full autotest/dfns/ snapshot suite regenerated; diff is additive-only. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01DTmmUhFmfsjihggQUcZ3Ja --- .../__snapshots__/v2.0.0.dev2/chf-cdb.json | 3 +- .../__snapshots__/v2.0.0.dev2/chf-cdb.toml | 1 + .../__snapshots__/v2.0.0.dev2/chf-cdb.yaml | 1 + .../__snapshots__/v2.0.0.dev2/chf-cxs.json | 1 + .../__snapshots__/v2.0.0.dev2/chf-cxs.toml | 1 + .../__snapshots__/v2.0.0.dev2/chf-cxs.yaml | 1 + .../__snapshots__/v2.0.0.dev2/chf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev2/chf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev2/chf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev2/chf-disv1d.json | 7 +- .../__snapshots__/v2.0.0.dev2/chf-disv1d.toml | 3 + .../__snapshots__/v2.0.0.dev2/chf-disv1d.yaml | 3 + .../__snapshots__/v2.0.0.dev2/chf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev2/chf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev2/chf-zdg.yaml | 1 + .../__snapshots__/v2.0.0.dev2/exg-chfgwf.json | 6 +- .../__snapshots__/v2.0.0.dev2/exg-chfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev2/exg-chfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwegwe.json | 6 +- .../__snapshots__/v2.0.0.dev2/exg-gwegwe.toml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwegwe.yaml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwfgwf.json | 6 +- .../__snapshots__/v2.0.0.dev2/exg-gwfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwtgwt.json | 6 +- .../__snapshots__/v2.0.0.dev2/exg-gwtgwt.toml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwtgwt.yaml | 2 + .../__snapshots__/v2.0.0.dev2/exg-olfgwf.json | 6 +- .../__snapshots__/v2.0.0.dev2/exg-olfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev2/exg-olfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwe-disu.json | 8 +- .../__snapshots__/v2.0.0.dev2/gwe-disu.toml | 4 + .../__snapshots__/v2.0.0.dev2/gwe-disu.yaml | 4 + .../__snapshots__/v2.0.0.dev2/gwe-disv.json | 7 +- .../__snapshots__/v2.0.0.dev2/gwe-disv.toml | 3 + .../__snapshots__/v2.0.0.dev2/gwe-disv.yaml | 3 + .../__snapshots__/v2.0.0.dev2/gwe-lke.json | 2 + .../__snapshots__/v2.0.0.dev2/gwe-lke.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwe-lke.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwe-mwe.json | 2 + .../__snapshots__/v2.0.0.dev2/gwe-mwe.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwe-mwe.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwe-sfe.json | 2 + .../__snapshots__/v2.0.0.dev2/gwe-sfe.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwe-sfe.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwe-uze.json | 2 + .../__snapshots__/v2.0.0.dev2/gwe-uze.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwe-uze.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwf-buy.json | 1 + .../__snapshots__/v2.0.0.dev2/gwf-buy.toml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-buy.yaml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-csub.json | 1 + .../__snapshots__/v2.0.0.dev2/gwf-csub.toml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-csub.yaml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-disu.json | 8 +- .../__snapshots__/v2.0.0.dev2/gwf-disu.toml | 4 + .../__snapshots__/v2.0.0.dev2/gwf-disu.yaml | 4 + .../__snapshots__/v2.0.0.dev2/gwf-disv.json | 7 +- .../__snapshots__/v2.0.0.dev2/gwf-disv.toml | 3 + .../__snapshots__/v2.0.0.dev2/gwf-disv.yaml | 3 + .../__snapshots__/v2.0.0.dev2/gwf-evta.json | 1 + .../__snapshots__/v2.0.0.dev2/gwf-evta.toml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-evta.yaml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-gnc.json | 7 +- .../__snapshots__/v2.0.0.dev2/gwf-gnc.toml | 3 + .../__snapshots__/v2.0.0.dev2/gwf-gnc.yaml | 3 + .../__snapshots__/v2.0.0.dev2/gwf-lak.json | 22 +- .../__snapshots__/v2.0.0.dev2/gwf-lak.toml | 20 ++ .../__snapshots__/v2.0.0.dev2/gwf-lak.yaml | 20 ++ .../__snapshots__/v2.0.0.dev2/gwf-maw.json | 6 +- .../__snapshots__/v2.0.0.dev2/gwf-maw.toml | 4 + .../__snapshots__/v2.0.0.dev2/gwf-maw.yaml | 4 + .../__snapshots__/v2.0.0.dev2/gwf-mvr.json | 6 +- .../__snapshots__/v2.0.0.dev2/gwf-mvr.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwf-mvr.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwf-rcha.json | 1 + .../__snapshots__/v2.0.0.dev2/gwf-rcha.toml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-rcha.yaml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-sfr.json | 16 +- .../__snapshots__/v2.0.0.dev2/gwf-sfr.toml | 10 + .../__snapshots__/v2.0.0.dev2/gwf-sfr.yaml | 10 + .../__snapshots__/v2.0.0.dev2/gwf-uzf.json | 5 +- .../__snapshots__/v2.0.0.dev2/gwf-uzf.toml | 3 + .../__snapshots__/v2.0.0.dev2/gwf-uzf.yaml | 3 + .../__snapshots__/v2.0.0.dev2/gwf-vsc.json | 1 + .../__snapshots__/v2.0.0.dev2/gwf-vsc.toml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-vsc.yaml | 1 + .../__snapshots__/v2.0.0.dev2/gwt-disu.json | 8 +- .../__snapshots__/v2.0.0.dev2/gwt-disu.toml | 4 + .../__snapshots__/v2.0.0.dev2/gwt-disu.yaml | 4 + .../__snapshots__/v2.0.0.dev2/gwt-disv.json | 7 +- .../__snapshots__/v2.0.0.dev2/gwt-disv.toml | 3 + .../__snapshots__/v2.0.0.dev2/gwt-disv.yaml | 3 + .../__snapshots__/v2.0.0.dev2/gwt-lkt.json | 2 + .../__snapshots__/v2.0.0.dev2/gwt-lkt.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwt-lkt.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwt-mwt.json | 2 + .../__snapshots__/v2.0.0.dev2/gwt-mwt.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwt-mwt.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwt-sft.json | 2 + .../__snapshots__/v2.0.0.dev2/gwt-sft.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwt-sft.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwt-uzt.json | 2 + .../__snapshots__/v2.0.0.dev2/gwt-uzt.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwt-uzt.yaml | 2 + .../__snapshots__/v2.0.0.dev2/olf-cdb.json | 3 +- .../__snapshots__/v2.0.0.dev2/olf-cdb.toml | 1 + .../__snapshots__/v2.0.0.dev2/olf-cdb.yaml | 1 + .../__snapshots__/v2.0.0.dev2/olf-cxs.json | 1 + .../__snapshots__/v2.0.0.dev2/olf-cxs.toml | 1 + .../__snapshots__/v2.0.0.dev2/olf-cxs.yaml | 1 + .../__snapshots__/v2.0.0.dev2/olf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev2/olf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev2/olf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev2/olf-disv1d.json | 7 +- .../__snapshots__/v2.0.0.dev2/olf-disv1d.toml | 3 + .../__snapshots__/v2.0.0.dev2/olf-disv1d.yaml | 3 + .../__snapshots__/v2.0.0.dev2/olf-disv2d.json | 7 +- .../__snapshots__/v2.0.0.dev2/olf-disv2d.toml | 3 + .../__snapshots__/v2.0.0.dev2/olf-disv2d.yaml | 3 + .../__snapshots__/v2.0.0.dev2/olf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev2/olf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev2/olf-zdg.yaml | 1 + .../__snapshots__/v2.0.0.dev2/prt-disv.json | 7 +- .../__snapshots__/v2.0.0.dev2/prt-disv.toml | 3 + .../__snapshots__/v2.0.0.dev2/prt-disv.yaml | 3 + .../__snapshots__/v2.0.0.dev2/prt-prp.json | 1 + .../__snapshots__/v2.0.0.dev2/prt-prp.toml | 1 + .../__snapshots__/v2.0.0.dev2/prt-prp.yaml | 1 + .../__snapshots__/v2.0.0.dev2/swf-cdb.json | 3 +- .../__snapshots__/v2.0.0.dev2/swf-cdb.toml | 1 + .../__snapshots__/v2.0.0.dev2/swf-cdb.yaml | 1 + .../__snapshots__/v2.0.0.dev2/swf-cxs.json | 1 + .../__snapshots__/v2.0.0.dev2/swf-cxs.toml | 1 + .../__snapshots__/v2.0.0.dev2/swf-cxs.yaml | 1 + .../__snapshots__/v2.0.0.dev2/swf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev2/swf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev2/swf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev2/swf-disv1d.json | 7 +- .../__snapshots__/v2.0.0.dev2/swf-disv1d.toml | 3 + .../__snapshots__/v2.0.0.dev2/swf-disv1d.yaml | 3 + .../__snapshots__/v2.0.0.dev2/swf-disv2d.json | 7 +- .../__snapshots__/v2.0.0.dev2/swf-disv2d.toml | 3 + .../__snapshots__/v2.0.0.dev2/swf-disv2d.yaml | 3 + .../__snapshots__/v2.0.0.dev2/swf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev2/swf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev2/swf-zdg.yaml | 1 + .../__snapshots__/v2.0.0.dev2/utl-ats.json | 1 + .../__snapshots__/v2.0.0.dev2/utl-ats.toml | 1 + .../__snapshots__/v2.0.0.dev2/utl-ats.yaml | 1 + .../__snapshots__/v2.0.0.dev2/utl-spc.json | 1 + .../__snapshots__/v2.0.0.dev2/utl-spc.toml | 1 + .../__snapshots__/v2.0.0.dev2/utl-spc.yaml | 1 + .../__snapshots__/v2.0.0.dev3/chf-cdb.json | 3 +- .../__snapshots__/v2.0.0.dev3/chf-cdb.toml | 1 + .../__snapshots__/v2.0.0.dev3/chf-cdb.yaml | 1 + .../__snapshots__/v2.0.0.dev3/chf-cxs.json | 1 + .../__snapshots__/v2.0.0.dev3/chf-cxs.toml | 1 + .../__snapshots__/v2.0.0.dev3/chf-cxs.yaml | 1 + .../__snapshots__/v2.0.0.dev3/chf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev3/chf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev3/chf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev3/chf-disv1d.json | 7 +- .../__snapshots__/v2.0.0.dev3/chf-disv1d.toml | 3 + .../__snapshots__/v2.0.0.dev3/chf-disv1d.yaml | 3 + .../__snapshots__/v2.0.0.dev3/chf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev3/chf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev3/chf-zdg.yaml | 1 + .../__snapshots__/v2.0.0.dev3/exg-chfgwf.json | 6 +- .../__snapshots__/v2.0.0.dev3/exg-chfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev3/exg-chfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwegwe.json | 6 +- .../__snapshots__/v2.0.0.dev3/exg-gwegwe.toml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwegwe.yaml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwfgwf.json | 6 +- .../__snapshots__/v2.0.0.dev3/exg-gwfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwtgwt.json | 6 +- .../__snapshots__/v2.0.0.dev3/exg-gwtgwt.toml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwtgwt.yaml | 2 + .../__snapshots__/v2.0.0.dev3/exg-olfgwf.json | 6 +- .../__snapshots__/v2.0.0.dev3/exg-olfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev3/exg-olfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwe-disu.json | 8 +- .../__snapshots__/v2.0.0.dev3/gwe-disu.toml | 4 + .../__snapshots__/v2.0.0.dev3/gwe-disu.yaml | 4 + .../__snapshots__/v2.0.0.dev3/gwe-disv.json | 7 +- .../__snapshots__/v2.0.0.dev3/gwe-disv.toml | 3 + .../__snapshots__/v2.0.0.dev3/gwe-disv.yaml | 3 + .../__snapshots__/v2.0.0.dev3/gwe-lke.json | 2 + .../__snapshots__/v2.0.0.dev3/gwe-lke.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwe-lke.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwe-mwe.json | 2 + .../__snapshots__/v2.0.0.dev3/gwe-mwe.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwe-mwe.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwe-sfe.json | 2 + .../__snapshots__/v2.0.0.dev3/gwe-sfe.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwe-sfe.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwe-uze.json | 2 + .../__snapshots__/v2.0.0.dev3/gwe-uze.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwe-uze.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwf-buy.json | 1 + .../__snapshots__/v2.0.0.dev3/gwf-buy.toml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-buy.yaml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-csub.json | 1 + .../__snapshots__/v2.0.0.dev3/gwf-csub.toml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-csub.yaml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-disu.json | 8 +- .../__snapshots__/v2.0.0.dev3/gwf-disu.toml | 4 + .../__snapshots__/v2.0.0.dev3/gwf-disu.yaml | 4 + .../__snapshots__/v2.0.0.dev3/gwf-disv.json | 7 +- .../__snapshots__/v2.0.0.dev3/gwf-disv.toml | 3 + .../__snapshots__/v2.0.0.dev3/gwf-disv.yaml | 3 + .../__snapshots__/v2.0.0.dev3/gwf-evta.json | 1 + .../__snapshots__/v2.0.0.dev3/gwf-evta.toml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-evta.yaml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-gnc.json | 7 +- .../__snapshots__/v2.0.0.dev3/gwf-gnc.toml | 3 + .../__snapshots__/v2.0.0.dev3/gwf-gnc.yaml | 3 + .../__snapshots__/v2.0.0.dev3/gwf-lak.json | 22 +- .../__snapshots__/v2.0.0.dev3/gwf-lak.toml | 20 ++ .../__snapshots__/v2.0.0.dev3/gwf-lak.yaml | 20 ++ .../__snapshots__/v2.0.0.dev3/gwf-maw.json | 6 +- .../__snapshots__/v2.0.0.dev3/gwf-maw.toml | 4 + .../__snapshots__/v2.0.0.dev3/gwf-maw.yaml | 4 + .../__snapshots__/v2.0.0.dev3/gwf-mvr.json | 6 +- .../__snapshots__/v2.0.0.dev3/gwf-mvr.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwf-mvr.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwf-rcha.json | 1 + .../__snapshots__/v2.0.0.dev3/gwf-rcha.toml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-rcha.yaml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-sfr.json | 16 +- .../__snapshots__/v2.0.0.dev3/gwf-sfr.toml | 10 + .../__snapshots__/v2.0.0.dev3/gwf-sfr.yaml | 10 + .../__snapshots__/v2.0.0.dev3/gwf-uzf.json | 5 +- .../__snapshots__/v2.0.0.dev3/gwf-uzf.toml | 3 + .../__snapshots__/v2.0.0.dev3/gwf-uzf.yaml | 3 + .../__snapshots__/v2.0.0.dev3/gwf-vsc.json | 1 + .../__snapshots__/v2.0.0.dev3/gwf-vsc.toml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-vsc.yaml | 1 + .../__snapshots__/v2.0.0.dev3/gwt-disu.json | 8 +- .../__snapshots__/v2.0.0.dev3/gwt-disu.toml | 4 + .../__snapshots__/v2.0.0.dev3/gwt-disu.yaml | 4 + .../__snapshots__/v2.0.0.dev3/gwt-disv.json | 7 +- .../__snapshots__/v2.0.0.dev3/gwt-disv.toml | 3 + .../__snapshots__/v2.0.0.dev3/gwt-disv.yaml | 3 + .../__snapshots__/v2.0.0.dev3/gwt-lkt.json | 2 + .../__snapshots__/v2.0.0.dev3/gwt-lkt.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwt-lkt.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwt-mwt.json | 2 + .../__snapshots__/v2.0.0.dev3/gwt-mwt.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwt-mwt.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwt-sft.json | 2 + .../__snapshots__/v2.0.0.dev3/gwt-sft.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwt-sft.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwt-uzt.json | 2 + .../__snapshots__/v2.0.0.dev3/gwt-uzt.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwt-uzt.yaml | 2 + .../__snapshots__/v2.0.0.dev3/olf-cdb.json | 3 +- .../__snapshots__/v2.0.0.dev3/olf-cdb.toml | 1 + .../__snapshots__/v2.0.0.dev3/olf-cdb.yaml | 1 + .../__snapshots__/v2.0.0.dev3/olf-cxs.json | 1 + .../__snapshots__/v2.0.0.dev3/olf-cxs.toml | 1 + .../__snapshots__/v2.0.0.dev3/olf-cxs.yaml | 1 + .../__snapshots__/v2.0.0.dev3/olf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev3/olf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev3/olf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev3/olf-disv1d.json | 7 +- .../__snapshots__/v2.0.0.dev3/olf-disv1d.toml | 3 + .../__snapshots__/v2.0.0.dev3/olf-disv1d.yaml | 3 + .../__snapshots__/v2.0.0.dev3/olf-disv2d.json | 7 +- .../__snapshots__/v2.0.0.dev3/olf-disv2d.toml | 3 + .../__snapshots__/v2.0.0.dev3/olf-disv2d.yaml | 3 + .../__snapshots__/v2.0.0.dev3/olf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev3/olf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev3/olf-zdg.yaml | 1 + .../__snapshots__/v2.0.0.dev3/prt-disv.json | 7 +- .../__snapshots__/v2.0.0.dev3/prt-disv.toml | 3 + .../__snapshots__/v2.0.0.dev3/prt-disv.yaml | 3 + .../__snapshots__/v2.0.0.dev3/prt-prp.json | 1 + .../__snapshots__/v2.0.0.dev3/prt-prp.toml | 1 + .../__snapshots__/v2.0.0.dev3/prt-prp.yaml | 1 + .../__snapshots__/v2.0.0.dev3/swf-cdb.json | 3 +- .../__snapshots__/v2.0.0.dev3/swf-cdb.toml | 1 + .../__snapshots__/v2.0.0.dev3/swf-cdb.yaml | 1 + .../__snapshots__/v2.0.0.dev3/swf-cxs.json | 1 + .../__snapshots__/v2.0.0.dev3/swf-cxs.toml | 1 + .../__snapshots__/v2.0.0.dev3/swf-cxs.yaml | 1 + .../__snapshots__/v2.0.0.dev3/swf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev3/swf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev3/swf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev3/swf-disv1d.json | 7 +- .../__snapshots__/v2.0.0.dev3/swf-disv1d.toml | 3 + .../__snapshots__/v2.0.0.dev3/swf-disv1d.yaml | 3 + .../__snapshots__/v2.0.0.dev3/swf-disv2d.json | 7 +- .../__snapshots__/v2.0.0.dev3/swf-disv2d.toml | 3 + .../__snapshots__/v2.0.0.dev3/swf-disv2d.yaml | 3 + .../__snapshots__/v2.0.0.dev3/swf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev3/swf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev3/swf-zdg.yaml | 1 + .../__snapshots__/v2.0.0.dev3/utl-ats.json | 1 + .../__snapshots__/v2.0.0.dev3/utl-ats.toml | 1 + .../__snapshots__/v2.0.0.dev3/utl-ats.yaml | 1 + .../__snapshots__/v2.0.0.dev3/utl-spc.json | 1 + .../__snapshots__/v2.0.0.dev3/utl-spc.toml | 1 + .../__snapshots__/v2.0.0.dev3/utl-spc.yaml | 1 + docs/md/dfnspec.md | 10 + index-node-attributes-plan.md | 13 +- .../dfns/migrate_to_v2_0_0_dev2.py | 6 + modflow_devtools/dfns/schema.json | 231 ++++++++++++++++++ modflow_devtools/dfns/schema.py | 16 ++ todo.md | 19 +- 312 files changed, 1153 insertions(+), 104 deletions(-) diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.json index abadf23b..17dd4ccd 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.json @@ -97,7 +97,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.toml index 94bfb045..50cab52a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.toml @@ -87,6 +87,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.yaml index 4d173be2..e07b9eb9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.yaml @@ -100,6 +100,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.json index 45fce318..7eb21535 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.json @@ -50,6 +50,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once.", "tagged": false, + "index": true, "pk": true }, "nxspoints": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.toml index 30853422..224dddd0 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.toml @@ -41,6 +41,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.nxspoints] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.yaml index 56170ff3..f7ed53ca 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cxs.yaml @@ -46,6 +46,7 @@ blocks: with an error. The program will also terminate with an error if information for a section is specified more than once. tagged: false + index: true pk: true nxspoints: type: integer diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json index e22416b4..1b802098 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json @@ -93,6 +93,7 @@ "description": "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide.", "optional": true, "dtype": "integer", + "index": true, "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml index 593c2c48..4da15ecd 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml @@ -84,6 +84,7 @@ longname = "cross section number" description = "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide." optional = true dtype = "integer" +index = true shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml index ac112fd3..d12621a4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml @@ -101,5 +101,6 @@ blocks: that applies to the reach. If not provided then reach will be treated as hydraulically wide. optional: true dtype: integer + index: true shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json index c5b08f1c..200d46df 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json @@ -145,7 +145,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -179,7 +180,8 @@ "type": "integer", "longname": "cell1d number", "description": "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "fdc": { "type": "double", @@ -199,6 +201,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml index 3193538a..ddcebada 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml @@ -131,6 +131,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -159,6 +160,7 @@ type = "integer" longname = "cell1d number" description = "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell1d.fields.cell1d.item.fields.fdc] type = "double" @@ -178,6 +180,7 @@ longname = "number of cell vertices" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml index 61d3a27c..cbf29755 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml @@ -139,6 +139,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -165,6 +166,7 @@ blocks: description: is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last. tagged: false + index: true fdc: type: double longname: fractional distance to the cell center @@ -189,6 +191,7 @@ blocks: is calculated using the ZV of the first and last vertex point and FDC. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.json index a47099ef..d225827e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.json @@ -115,7 +115,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.toml index b62bff3f..26191bca 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.toml @@ -103,6 +103,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.yaml index 0bc52b95..18e09418 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.yaml @@ -116,6 +116,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.json index 42f7cf08..b5889f1f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.json @@ -73,13 +73,15 @@ "type": "integer", "longname": "cellid of cell in surface water model", "description": "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm2": { "type": "integer", "longname": "cellid of cell in groundwater model", "description": "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "bedleak": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.toml index 329c5b10..050d25a5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.toml @@ -63,12 +63,14 @@ type = "integer" longname = "cellid of cell in surface water model" description = "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" longname = "cellid of cell in groundwater model" description = "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.bedleak] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.yaml index bff3b203..3a6e6974 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.yaml @@ -69,6 +69,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false + index: true cellidm2: type: integer longname: cellid of cell in groundwater model @@ -78,6 +79,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false + index: true bedleak: type: double longname: bed leakance diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.json index 1111ca2b..ea2ff9ab 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.json @@ -146,13 +146,15 @@ "type": "integer", "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.toml index 0a352ae7..bb2929f0 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.toml @@ -134,12 +134,14 @@ type = "integer" longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.yaml index 2687a713..3c6bd6aa 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.yaml @@ -148,6 +148,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false + index: true cellidm2: type: integer longname: cellid of second cell @@ -157,6 +158,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false + index: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.json index 5836f99d..6d380cd1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.json @@ -173,13 +173,15 @@ "type": "integer", "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.toml index ec950330..5e8f9fc4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.toml @@ -157,12 +157,14 @@ type = "integer" longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.yaml index c10c5191..c32d8a5d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.yaml @@ -193,6 +193,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false + index: true cellidm2: type: integer longname: cellid of second cell @@ -202,6 +203,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false + index: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.json index 1f53c332..8510d38d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.json @@ -146,13 +146,15 @@ "type": "integer", "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.toml index 056033de..5ff99e4e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.toml @@ -134,12 +134,14 @@ type = "integer" longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.yaml index be30a96c..b86c7f4d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.yaml @@ -146,6 +146,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false + index: true cellidm2: type: integer longname: cellid of second cell @@ -155,6 +156,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false + index: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.json index 306cfe95..502d2bce 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.json @@ -73,13 +73,15 @@ "type": "integer", "longname": "cellid of cell in surface water model", "description": "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm2": { "type": "integer", "longname": "cellid of cell in groundwater model", "description": "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "bedleak": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.toml index 201303de..61e0cb68 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.toml @@ -63,12 +63,14 @@ type = "integer" longname = "cellid of cell in surface water model" description = "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" longname = "cellid of cell in groundwater model" description = "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.bedleak] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.yaml index 6b1bd5e1..470fa58e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.yaml @@ -69,6 +69,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false + index: true cellidm2: type: integer longname: cellid of cell in groundwater model @@ -78,6 +79,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false + index: true bedleak: type: double longname: bed leakance diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.json index 15c36b4e..b23dfdd6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.json @@ -172,6 +172,7 @@ "longname": "grid connectivity", "description": "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWE cells and their connections to the other GWE cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code.", "dtype": "integer", + "index": true, "shape": [ "nja" ] @@ -227,7 +228,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -261,7 +263,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -287,6 +290,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.toml index 71868161..e58df6e8 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.toml @@ -153,6 +153,7 @@ type = "array" longname = "grid connectivity" description = "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWE cells and their connections to the other GWE cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code." dtype = "integer" +index = true shape = [ "nja", ] @@ -209,6 +210,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -237,6 +239,7 @@ type = "integer" longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -262,6 +265,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.yaml index bf0975c3..6214df8c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.yaml @@ -177,6 +177,7 @@ blocks: cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code. dtype: integer + index: true shape: - nja ihc: @@ -245,6 +246,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -271,6 +273,7 @@ blocks: description: is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -294,6 +297,7 @@ blocks: used to define the cell. Vertices must be listed in clockwise order. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.json index 9bb9900b..48b8d024 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.json @@ -186,7 +186,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -220,7 +221,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -246,6 +248,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.toml index f7bf5d9f..645d6575 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.toml @@ -170,6 +170,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -198,6 +199,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -223,6 +225,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.yaml index 1bbf8826..d43be729 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.yaml @@ -178,6 +178,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -204,6 +205,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -228,6 +230,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.json index abcab31c..794c0cf9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.json @@ -165,6 +165,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the lake number associated with the specified PACKAGEDATA data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -221,6 +222,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the lake number associated with the specified PERIOD data on the line. LAKENO must be greater than zero and less than or equal to NLAKES.", "tagged": false, + "index": true, "fk": "packagedata.lakeno" }, "laksetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.toml index 76b88f0a..bd077a96 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.toml @@ -147,6 +147,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the lake number associated with the specified PACKAGEDATA data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -197,6 +198,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the lake number associated with the specified PERIOD data on the line. LAKENO must be greater than zero and less than or equal to NLAKES." tagged = false +index = true fk = "packagedata.lakeno" [blocks.period.fields.lakeperioddata.item.fields.laksetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.yaml index 326bebfd..d875c483 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-lke.yaml @@ -162,6 +162,7 @@ blocks: program will also terminate with an error if information for a lake is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -216,6 +217,7 @@ blocks: description: integer value that defines the lake number associated with the specified PERIOD data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. tagged: false + index: true fk: packagedata.lakeno laksetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.json index f5ddc905..dbe362b2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.json @@ -165,6 +165,7 @@ "longname": "well number for this entry", "description": "integer value that defines the well number associated with the specified PACKAGEDATA data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -221,6 +222,7 @@ "longname": "well number for this entry", "description": "integer value that defines the well number associated with the specified PERIOD data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS.", "tagged": false, + "index": true, "fk": "packagedata.mawno" }, "mwesetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.toml index 9f779cbe..f2b3b5cf 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.toml @@ -147,6 +147,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the well number associated with the specified PACKAGEDATA data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -197,6 +198,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the well number associated with the specified PERIOD data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS." tagged = false +index = true fk = "packagedata.mawno" [blocks.period.fields.mweperioddata.item.fields.mwesetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.yaml index bc268e51..f14d350d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-mwe.yaml @@ -162,6 +162,7 @@ blocks: error. The program will also terminate with an error if information for a well is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -216,6 +217,7 @@ blocks: description: integer value that defines the well number associated with the specified PERIOD data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. tagged: false + index: true fk: packagedata.mawno mwesetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.json index 17a18479..b2c579df 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.json @@ -165,6 +165,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the reach number associated with the specified PACKAGEDATA data on the line. RNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -221,6 +222,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the reach number associated with the specified PERIOD data on the line. RNO must be greater than zero and less than or equal to NREACHES.", "tagged": false, + "index": true, "fk": "packagedata.rno" }, "reachsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.toml index 24a26465..ec3326e8 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.toml @@ -147,6 +147,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the reach number associated with the specified PACKAGEDATA data on the line. RNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -197,6 +198,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the reach number associated with the specified PERIOD data on the line. RNO must be greater than zero and less than or equal to NREACHES." tagged = false +index = true fk = "packagedata.rno" [blocks.period.fields.reachperioddata.item.fields.reachsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.yaml index a2367b2e..55d94516 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-sfe.yaml @@ -163,6 +163,7 @@ blocks: program will also terminate with an error if information for a reach is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -217,6 +218,7 @@ blocks: description: integer value that defines the reach number associated with the specified PERIOD data on the line. RNO must be greater than zero and less than or equal to NREACHES. tagged: false + index: true fk: packagedata.rno reachsetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.json index 9e86b21f..03d4bfd7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.json @@ -165,6 +165,7 @@ "longname": "UZF cell number for this entry", "description": "integer value that defines the UZF cell number associated with the specified PACKAGEDATA data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS. Unsaturated zone flow information must be specified for every UZF cell or the program will terminate with an error. The program also will terminate with an error if information for a UZF cell is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -209,6 +210,7 @@ "longname": "unsaturated zone flow cell number for this entry", "description": "integer value that defines the UZF cell number associated with the specified PERIOD data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS.", "tagged": false, + "index": true, "fk": "packagedata.uzfno" }, "uzesetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.toml index f306757c..c12894ca 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.toml @@ -147,6 +147,7 @@ type = "integer" longname = "UZF cell number for this entry" description = "integer value that defines the UZF cell number associated with the specified PACKAGEDATA data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS. Unsaturated zone flow information must be specified for every UZF cell or the program will terminate with an error. The program also will terminate with an error if information for a UZF cell is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -185,6 +186,7 @@ type = "integer" longname = "unsaturated zone flow cell number for this entry" description = "integer value that defines the UZF cell number associated with the specified PERIOD data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS." tagged = false +index = true fk = "packagedata.uzfno" [blocks.period.fields.uzeperioddata.item.fields.uzesetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.yaml index 3078fa9c..a7600726 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-uze.yaml @@ -163,6 +163,7 @@ blocks: program will terminate with an error. The program also will terminate with an error if information for a UZF cell is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -206,6 +207,7 @@ blocks: description: integer value that defines the UZF cell number associated with the specified PERIOD data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS. tagged: false + index: true fk: packagedata.uzfno uzesetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.json index afe07904..ca5d4c94 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.json @@ -73,6 +73,7 @@ "longname": "species number for this entry", "description": "integer value that defines the species number associated with the specified PACKAGEDATA data on the line. IRHOSPECIES must be greater than zero and less than or equal to NRHOSPECIES. Information must be specified for each of the NRHOSPECIES species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once.", "tagged": false, + "index": true, "pk": true }, "drhodc": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.toml index 2eac90c5..0b7a4f1c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.toml @@ -62,6 +62,7 @@ type = "integer" longname = "species number for this entry" description = "integer value that defines the species number associated with the specified PACKAGEDATA data on the line. IRHOSPECIES must be greater than zero and less than or equal to NRHOSPECIES. Information must be specified for each of the NRHOSPECIES species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.drhodc] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.yaml index 0bae73b3..35a13662 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-buy.yaml @@ -71,6 +71,7 @@ blocks: program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once. tagged: false + index: true pk: true drhodc: type: double diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.json index fa7894bb..becf53f2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.json @@ -387,6 +387,7 @@ "longname": "CSUB id number for this entry", "description": "integer value that defines the CSUB interbed number associated with the specified PACKAGEDATA data on the line. CSUBNO must be greater than zero and less than or equal to NINTERBEDS. CSUB information must be specified for every CSUB cell or the program will terminate with an error. The program will also terminate with an error if information for a CSUB interbed number is specified more than once.", "tagged": false, + "index": true, "pk": true }, "cellid": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.toml index d46cfdcd..273ebd69 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.toml @@ -352,6 +352,7 @@ type = "integer" longname = "CSUB id number for this entry" description = "integer value that defines the CSUB interbed number associated with the specified PACKAGEDATA data on the line. CSUBNO must be greater than zero and less than or equal to NINTERBEDS. CSUB information must be specified for every CSUB cell or the program will terminate with an error. The program will also terminate with an error if information for a CSUB interbed number is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.cellid] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.yaml index 2da9ae05..b900beb8 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-csub.yaml @@ -372,6 +372,7 @@ blocks: will terminate with an error. The program will also terminate with an error if information for a CSUB interbed number is specified more than once. tagged: false + index: true pk: true cellid: type: array diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.json index bca862ed..48500013 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.json @@ -172,6 +172,7 @@ "longname": "grid connectivity", "description": "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWF cells and their connections to the other GWF cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code.", "dtype": "integer", + "index": true, "shape": [ "nja" ] @@ -228,7 +229,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -263,7 +265,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -289,6 +292,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.toml index f96c687f..efe24080 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.toml @@ -153,6 +153,7 @@ type = "array" longname = "grid connectivity" description = "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWF cells and their connections to the other GWF cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code." dtype = "integer" +index = true shape = [ "nja", ] @@ -210,6 +211,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -239,6 +241,7 @@ type = "integer" longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -264,6 +267,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.yaml index f6d5d665..5a20f961 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.yaml @@ -177,6 +177,7 @@ blocks: cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code. dtype: integer + index: true shape: - nja ihc: @@ -246,6 +247,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -273,6 +275,7 @@ blocks: description: is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -296,6 +299,7 @@ blocks: used to define the cell. Vertices must be listed in clockwise order. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.json index 3e8c6114..6432b091 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.json @@ -186,7 +186,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -220,7 +221,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -246,6 +248,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.toml index 44af7726..0c016b4f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.toml @@ -170,6 +170,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -198,6 +199,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -223,6 +225,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.yaml index 370982a3..56d60dd2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.yaml @@ -178,6 +178,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -204,6 +205,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -228,6 +230,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.json index 3e5ee5bf..8feb507f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.json @@ -109,6 +109,7 @@ "optional": true, "netcdf": true, "dtype": "integer", + "index": true, "shape": [ "ncpl" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.toml index f324d12d..d18e5aa9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.toml @@ -96,6 +96,7 @@ description = "IEVT is the layer number that defines the layer in each vertical optional = true netcdf = true dtype = "integer" +index = true shape = [ "ncpl", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.yaml index 64d68f19..84b01337 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-evta.yaml @@ -115,6 +115,7 @@ blocks: optional: true netcdf: true dtype: integer + index: true shape: - ncpl surface: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.json index 746b5c68..43552570 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.json @@ -61,13 +61,15 @@ "type": "integer", "longname": "GNC cellid n", "description": "is the cellid of the cell, $n$, in which the ghost node is located. For a structured grid that uses the DIS input file, CELLIDN is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDN is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDN is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm": { "type": "integer", "longname": "GNC cellid n", "description": "is the cellid of the connecting cell, $m$, to which flow occurs from the ghost node. For a structured grid that uses the DIS input file, CELLIDM is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidsj": { "type": "array", @@ -75,6 +77,7 @@ "description": "is the array of CELLIDS for the contributing j cells, which contribute to the interpolated head value at the ghost node. This item contains one CELLID for each of the contributing cells of the ghost node. Note that if the number of actual contributing cells needed by the user is less than NUMALPHAJ for any ghost node, then a dummy CELLID of zero(s) should be inserted with an associated contributing factor of zero. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLID is the layer number and cell2d number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLID is the node number for the cell.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "numalphaj" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.toml index e8542cd3..da73c9a8 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.toml @@ -53,12 +53,14 @@ type = "integer" longname = "GNC cellid n" description = "is the cellid of the cell, $n$, in which the ghost node is located. For a structured grid that uses the DIS input file, CELLIDN is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDN is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDN is the node number for the cell." tagged = false +index = true [blocks.gncdata.fields.gncdata.item.fields.cellidm] type = "integer" longname = "GNC cellid n" description = "is the cellid of the connecting cell, $m$, to which flow occurs from the ghost node. For a structured grid that uses the DIS input file, CELLIDM is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM is the node number for the cell." tagged = false +index = true [blocks.gncdata.fields.gncdata.item.fields.cellidsj] type = "array" @@ -66,6 +68,7 @@ longname = "GNC contributing cells" description = "is the array of CELLIDS for the contributing j cells, which contribute to the interpolated head value at the ghost node. This item contains one CELLID for each of the contributing cells of the ghost node. Note that if the number of actual contributing cells needed by the user is less than NUMALPHAJ for any ghost node, then a dummy CELLID of zero(s) should be inserted with an associated contributing factor of zero. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLID is the layer number and cell2d number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLID is the node number for the cell." tagged = false dtype = "integer" +index = true shape = [ "numalphaj", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.yaml index 93a0de08..43e1b016 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.yaml @@ -63,6 +63,7 @@ blocks: number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDN is the node number for the cell. tagged: false + index: true cellidm: type: integer longname: GNC cellid n @@ -72,6 +73,7 @@ blocks: layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM is the node number for the cell. tagged: false + index: true cellidsj: type: array longname: GNC contributing cells @@ -86,6 +88,7 @@ blocks: CELLID is the node number for the cell. tagged: false dtype: integer + index: true shape: - numalphaj alphasj: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.json index 598ed9a9..da6c110e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.json @@ -241,6 +241,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the feature (lake) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -294,13 +295,15 @@ "longname": "lake number for this entry", "description": "integer value that defines the feature (lake) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake connection information must be specified for every lake connection to the GWF model (NLAKECONN) or the program will terminate with an error. The program will also terminate with an error if connection information for a lake connection to the GWF model is specified more than once.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "iconn": { "type": "integer", "longname": "connection number for this entry", "description": "integer value that defines the GWF connection number for this lake connection entry. ICONN must be greater than zero and less than or equal to NLAKECONN for lake IFNO.", - "tagged": false + "tagged": false, + "index": true }, "cellid": { "type": "array", @@ -368,6 +371,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the feature (lake) number associated with the specified TABLES data on the line. IFNO must be greater than zero and less than or equal to NLAKES. The program will terminate with an error if table information for a lake is specified more than once or the number of specified tables is less than NTABLES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "tab6": { @@ -407,6 +411,7 @@ "longname": "outlet number for this entry", "description": "integer value that defines the outlet number associated with the specified OUTLETS data on the line. OUTLETNO must be greater than zero and less than or equal to NOUTLETS. Outlet information must be specified for every outlet or the program will terminate with an error. The program will also terminate with an error if information for a outlet is specified more than once.", "tagged": false, + "index": true, "pk": true }, "lakein": { @@ -414,6 +419,7 @@ "longname": "lake number for upstream lake", "description": "integer value that defines the lake number that outlet is connected to. LAKEIN must be greater than zero and less than or equal to NLAKES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "lakeout": { @@ -421,6 +427,7 @@ "longname": "lake number for downstream lake", "description": "integer value that defines the lake number that outlet discharge from lake outlet OUTLETNO is routed to. LAKEOUT must be greater than or equal to zero and less than or equal to NLAKES. If LAKEOUT is zero, outlet discharge from lake outlet OUTLETNO is discharged to an external boundary.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "couttype": { @@ -484,6 +491,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "status": { @@ -501,6 +509,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "stage": { @@ -519,6 +528,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "rainfall": { @@ -537,6 +547,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "evaporation": { @@ -555,6 +566,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "runoff": { @@ -573,6 +585,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "inflow": { @@ -591,6 +604,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "withdrawal": { @@ -609,6 +623,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "outlets.outletno" }, "rate": { @@ -627,6 +642,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "outlets.outletno" }, "invert": { @@ -645,6 +661,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "outlets.outletno" }, "width": { @@ -663,6 +680,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "outlets.outletno" }, "slope": { @@ -681,6 +699,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "outlets.outletno" }, "rough": { @@ -699,6 +718,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "auxiliary": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.toml index 59b8029d..0daa79ee 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.toml @@ -220,6 +220,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the feature (lake) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -267,6 +268,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the feature (lake) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake connection information must be specified for every lake connection to the GWF model (NLAKECONN) or the program will terminate with an error. The program will also terminate with an error if connection information for a lake connection to the GWF model is specified more than once." tagged = false +index = true fk = "packagedata.ifno" [blocks.connectiondata.fields.connectiondata.item.fields.iconn] @@ -274,6 +276,7 @@ type = "integer" longname = "connection number for this entry" description = "integer value that defines the GWF connection number for this lake connection entry. ICONN must be greater than zero and less than or equal to NLAKECONN for lake IFNO." tagged = false +index = true [blocks.connectiondata.fields.connectiondata.item.fields.cellid] type = "array" @@ -335,6 +338,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the feature (lake) number associated with the specified TABLES data on the line. IFNO must be greater than zero and less than or equal to NLAKES. The program will terminate with an error if table information for a lake is specified more than once or the number of specified tables is less than NTABLES." tagged = false +index = true fk = "packagedata.ifno" [blocks.tables.fields.tables.item.fields.tab6] @@ -368,6 +372,7 @@ type = "integer" longname = "outlet number for this entry" description = "integer value that defines the outlet number associated with the specified OUTLETS data on the line. OUTLETNO must be greater than zero and less than or equal to NOUTLETS. Outlet information must be specified for every outlet or the program will terminate with an error. The program will also terminate with an error if information for a outlet is specified more than once." tagged = false +index = true pk = true [blocks.outlets.fields.outlets.item.fields.lakein] @@ -375,6 +380,7 @@ type = "integer" longname = "lake number for upstream lake" description = "integer value that defines the lake number that outlet is connected to. LAKEIN must be greater than zero and less than or equal to NLAKES." tagged = false +index = true fk = "packagedata.ifno" [blocks.outlets.fields.outlets.item.fields.lakeout] @@ -382,6 +388,7 @@ type = "integer" longname = "lake number for downstream lake" description = "integer value that defines the lake number that outlet discharge from lake outlet OUTLETNO is routed to. LAKEOUT must be greater than or equal to zero and less than or equal to NLAKES. If LAKEOUT is zero, outlet discharge from lake outlet OUTLETNO is discharged to an external boundary." tagged = false +index = true fk = "packagedata.ifno" [blocks.outlets.fields.outlets.item.fields.couttype] @@ -436,6 +443,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.status.fields.status] @@ -451,6 +459,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.stage.fields.stage] @@ -467,6 +476,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.rainfall.fields.rainfall] @@ -483,6 +493,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.evaporation.fields.evaporation] @@ -499,6 +510,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.runoff.fields.runoff] @@ -515,6 +527,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.inflow.fields.inflow] @@ -531,6 +544,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.withdrawal.fields.withdrawal] @@ -547,6 +561,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "outlets.outletno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.rate.fields.rate] @@ -563,6 +578,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "outlets.outletno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.invert.fields.invert] @@ -579,6 +595,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "outlets.outletno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.width.fields.width] @@ -595,6 +612,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "outlets.outletno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.slope.fields.slope] @@ -611,6 +629,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "outlets.outletno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.rough.fields.rough] @@ -627,6 +646,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.auxiliaryrecord.fields.auxiliary] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.yaml index 982a1a40..d533a1a3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-lak.yaml @@ -238,6 +238,7 @@ blocks: with an error. The program will also terminate with an error if information for a lake is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -293,6 +294,7 @@ blocks: also terminate with an error if connection information for a lake connection to the GWF model is specified more than once. tagged: false + index: true fk: packagedata.ifno iconn: type: integer @@ -300,6 +302,7 @@ blocks: description: integer value that defines the GWF connection number for this lake connection entry. ICONN must be greater than zero and less than or equal to NLAKECONN for lake IFNO. tagged: false + index: true cellid: type: array longname: cell identifier @@ -391,6 +394,7 @@ blocks: The program will terminate with an error if table information for a lake is specified more than once or the number of specified tables is less than NTABLES. tagged: false + index: true fk: packagedata.ifno tab6: type: keyword @@ -429,6 +433,7 @@ blocks: with an error. The program will also terminate with an error if information for a outlet is specified more than once. tagged: false + index: true pk: true lakein: type: integer @@ -436,6 +441,7 @@ blocks: description: integer value that defines the lake number that outlet is connected to. LAKEIN must be greater than zero and less than or equal to NLAKES. tagged: false + index: true fk: packagedata.ifno lakeout: type: integer @@ -445,6 +451,7 @@ blocks: or equal to NLAKES. If LAKEOUT is zero, outlet discharge from lake outlet OUTLETNO is discharged to an external boundary. tagged: false + index: true fk: packagedata.ifno couttype: type: string @@ -519,6 +526,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno status: type: string @@ -536,6 +544,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno stage: type: string @@ -557,6 +566,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno rainfall: type: string @@ -578,6 +588,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno evaporation: type: string @@ -599,6 +610,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno runoff: type: string @@ -620,6 +632,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno inflow: type: string @@ -641,6 +654,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno withdrawal: type: string @@ -662,6 +676,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: outlets.outletno rate: type: string @@ -686,6 +701,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: outlets.outletno invert: type: string @@ -707,6 +723,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: outlets.outletno width: type: string @@ -728,6 +745,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: outlets.outletno slope: type: string @@ -749,6 +767,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: outlets.outletno rough: type: string @@ -770,6 +789,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno auxiliary: type: keyword diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.json index 62d77758..f6187413 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.json @@ -219,6 +219,7 @@ "longname": "well number for this entry", "description": "integer value that defines the feature (well) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Multi-aquifer well information must be specified for every multi-aquifer well or the program will terminate with an error. The program will also terminate with an error if information for a multi-aquifer well is specified more than once.", "tagged": false, + "index": true, "pk": true }, "radius": { @@ -290,13 +291,15 @@ "longname": "well number for this entry", "description": "integer value that defines the feature (well) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Multi-aquifer well connection information must be specified for every multi-aquifer well connection to the GWF model (NGWFNODES) or the program will terminate with an error. The program will also terminate with an error if connection information for a multi-aquifer well connection to the GWF model is specified more than once.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "icon": { "type": "integer", "longname": "connection number", "description": "integer value that defines the GWF connection number for this multi-aquifer well connection entry. ICONN must be greater than zero and less than or equal to NGWFNODES for multi-aquifer well IFNO.", - "tagged": false + "tagged": false, + "index": true }, "cellid": { "type": "array", @@ -349,6 +352,7 @@ "longname": "well number for this entry", "description": "integer value that defines the well number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "mawsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.toml index 26dbb4ba..9929dd9a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.toml @@ -198,6 +198,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the feature (well) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Multi-aquifer well information must be specified for every multi-aquifer well or the program will terminate with an error. The program will also terminate with an error if information for a multi-aquifer well is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.radius] @@ -260,6 +261,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the feature (well) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Multi-aquifer well connection information must be specified for every multi-aquifer well connection to the GWF model (NGWFNODES) or the program will terminate with an error. The program will also terminate with an error if connection information for a multi-aquifer well connection to the GWF model is specified more than once." tagged = false +index = true fk = "packagedata.ifno" [blocks.connectiondata.fields.connectiondata.item.fields.icon] @@ -267,6 +269,7 @@ type = "integer" longname = "connection number" description = "integer value that defines the GWF connection number for this multi-aquifer well connection entry. ICONN must be greater than zero and less than or equal to NGWFNODES for multi-aquifer well IFNO." tagged = false +index = true [blocks.connectiondata.fields.connectiondata.item.fields.cellid] type = "array" @@ -313,6 +316,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the well number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.mawsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.yaml index 13c8c61c..9d0c3f8b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-maw.yaml @@ -225,6 +225,7 @@ blocks: or the program will terminate with an error. The program will also terminate with an error if information for a multi-aquifer well is specified more than once. tagged: false + index: true pk: true radius: type: double @@ -319,6 +320,7 @@ blocks: program will also terminate with an error if connection information for a multi-aquifer well connection to the GWF model is specified more than once. tagged: false + index: true fk: packagedata.ifno icon: type: integer @@ -327,6 +329,7 @@ blocks: well connection entry. ICONN must be greater than zero and less than or equal to NGWFNODES for multi-aquifer well IFNO. tagged: false + index: true cellid: type: array longname: cell identifier @@ -397,6 +400,7 @@ blocks: description: integer value that defines the well number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. tagged: false + index: true fk: packagedata.ifno mawsetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.json index 4ce936fa..686372f4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.json @@ -137,7 +137,8 @@ "type": "integer", "longname": "provider reach", "description": "is the identifier for the provider. For the standard boundary packages, the provider identifier is the number of the boundary as it is listed in the package input file. (Note that the order of these boundaries may change by stress period, which must be accounted for in the Mover Package.) So the first well has an identifier of one. The second is two, and so forth. For the advanced packages, the identifier is the reach number (SFR Package), well number (MAW Package), or UZF cell number. For the Lake Package, ID1 is the lake outlet number. Thus, outflows from a single lake can be routed to different streams, for example.", - "tagged": false + "tagged": false, + "index": true }, "mname2": { "type": "string", @@ -156,7 +157,8 @@ "type": "integer", "longname": "receiver reach", "description": "is the identifier for the receiver. The receiver identifier is the reach number (SFR Package), Lake number (LAK Package), well number (MAW Package), or UZF cell number.", - "tagged": false + "tagged": false, + "index": true }, "mvrtype": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.toml index 6b38a185..0b6c4138 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.toml @@ -116,6 +116,7 @@ type = "integer" longname = "provider reach" description = "is the identifier for the provider. For the standard boundary packages, the provider identifier is the number of the boundary as it is listed in the package input file. (Note that the order of these boundaries may change by stress period, which must be accounted for in the Mover Package.) So the first well has an identifier of one. The second is two, and so forth. For the advanced packages, the identifier is the reach number (SFR Package), well number (MAW Package), or UZF cell number. For the Lake Package, ID1 is the lake outlet number. Thus, outflows from a single lake can be routed to different streams, for example." tagged = false +index = true [blocks.period.fields.perioddata.item.fields.mname2] type = "string" @@ -135,6 +136,7 @@ type = "integer" longname = "receiver reach" description = "is the identifier for the receiver. The receiver identifier is the reach number (SFR Package), Lake number (LAK Package), well number (MAW Package), or UZF cell number." tagged = false +index = true [blocks.period.fields.perioddata.item.fields.mvrtype] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.yaml index 75ab9312..9baa408e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-mvr.yaml @@ -131,6 +131,7 @@ blocks: is the lake outlet number. Thus, outflows from a single lake can be routed to different streams, for example. tagged: false + index: true mname2: type: string description: name of model containing the package, PNAME2. @@ -150,6 +151,7 @@ blocks: description: is the identifier for the receiver. The receiver identifier is the reach number (SFR Package), Lake number (LAK Package), well number (MAW Package), or UZF cell number. tagged: false + index: true mvrtype: type: string longname: mover type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.json index 64bb4898..9ef2f2b2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.json @@ -109,6 +109,7 @@ "optional": true, "netcdf": true, "dtype": "integer", + "index": true, "shape": [ "ncpl" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.toml index ec311806..4dfd6477 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.toml @@ -96,6 +96,7 @@ description = "IRCH is the layer number that defines the layer in each vertical optional = true netcdf = true dtype = "integer" +index = true shape = [ "ncpl", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.yaml index af3be5ea..9a8d27eb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-rcha.yaml @@ -115,6 +115,7 @@ blocks: optional: true netcdf: true dtype: integer + index: true shape: - ncpl recharge: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.json index 9d5d0f79..232ed997 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.json @@ -239,6 +239,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once.", "tagged": false, + "index": true, "pk": true }, "cellid": { @@ -353,6 +354,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified cross-section table file on the line. IFNO must be greater than zero and less than or equal to NREACHES. The program will also terminate with an error if table information for a reach is specified more than once.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "tab6": { @@ -389,6 +391,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach connection information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if connection information for a reach is specified more than once.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "ic": { @@ -398,6 +401,7 @@ "optional": true, "tagged": false, "dtype": "integer", + "index": true, "shape": [ "packagedata.ncon(ifno)" ] @@ -419,19 +423,22 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified DIVERSIONS data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach diversion information must be specified for every reach with a NDV value greater than 0 or the program will terminate with an error. The program will also terminate with an error if diversion information for a given reach diversion is specified more than once.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "idv": { "type": "integer", "longname": "downstream diversion number", "description": "integer value that defines the downstream diversion number for the diversion for reach IFNO. IDV must be greater than zero and less than or equal to NDV for reach IFNO.", - "tagged": false + "tagged": false, + "index": true }, "iconr": { "type": "integer", "longname": "downstream reach number for diversion", "description": "integer value that defines the downstream reach that will receive the diverted water. IDV must be greater than zero and less than or equal to NREACHES. Furthermore, reach ICONR must be a downstream connection for reach IFNO.", - "tagged": false + "tagged": false, + "index": true }, "cprior": { "type": "string", @@ -456,6 +463,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified initial stage. Initial stage data must be specified for every reach or the program will terminate with an error. The program will also terminate with a error if IFNO is less than one or greater than NREACHES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "initialstage": { @@ -481,6 +489,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "sfrsetting": { @@ -546,7 +555,8 @@ "type": "integer", "longname": "diversion number", "description": "an integer value specifying which diversion of reach IFNO that DIVFLOW is being specified for. Must be less or equal to ndv for the current reach (IFNO).", - "tagged": false + "tagged": false, + "index": true }, "divflow": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.toml index 6b790a4b..073816be 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.toml @@ -218,6 +218,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.cellid] @@ -323,6 +324,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified cross-section table file on the line. IFNO must be greater than zero and less than or equal to NREACHES. The program will also terminate with an error if table information for a reach is specified more than once." tagged = false +index = true fk = "packagedata.ifno" [blocks.crosssections.fields.crosssections.item.fields.tab6] @@ -353,6 +355,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach connection information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if connection information for a reach is specified more than once." tagged = false +index = true fk = "packagedata.ifno" [blocks.connectiondata.fields.connectiondata.item.fields.ic] @@ -362,6 +365,7 @@ description = "integer value that defines the reach number of the reach connecte optional = true tagged = false dtype = "integer" +index = true shape = [ "packagedata.ncon(ifno)", ] @@ -377,6 +381,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified DIVERSIONS data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach diversion information must be specified for every reach with a NDV value greater than 0 or the program will terminate with an error. The program will also terminate with an error if diversion information for a given reach diversion is specified more than once." tagged = false +index = true fk = "packagedata.ifno" [blocks.diversions.fields.diversions.item.fields.idv] @@ -384,12 +389,14 @@ type = "integer" longname = "downstream diversion number" description = "integer value that defines the downstream diversion number for the diversion for reach IFNO. IDV must be greater than zero and less than or equal to NDV for reach IFNO." tagged = false +index = true [blocks.diversions.fields.diversions.item.fields.iconr] type = "integer" longname = "downstream reach number for diversion" description = "integer value that defines the downstream reach that will receive the diverted water. IDV must be greater than zero and less than or equal to NREACHES. Furthermore, reach ICONR must be a downstream connection for reach IFNO." tagged = false +index = true [blocks.diversions.fields.diversions.item.fields.cprior] type = "string" @@ -408,6 +415,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified initial stage. Initial stage data must be specified for every reach or the program will terminate with an error. The program will also terminate with a error if IFNO is less than one or greater than NREACHES." tagged = false +index = true fk = "packagedata.ifno" [blocks.initialstages.fields.initialstages.item.fields.initialstage] @@ -427,6 +435,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.sfrsetting] @@ -493,6 +502,7 @@ type = "integer" longname = "diversion number" description = "an integer value specifying which diversion of reach IFNO that DIVFLOW is being specified for. Must be less or equal to ndv for the current reach (IFNO)." tagged = false +index = true [blocks.period.fields.perioddata.item.fields.sfrsetting.arms.diversionrecord.fields.divflow] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.yaml index ee53ea13..ed607284 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.yaml @@ -244,6 +244,7 @@ blocks: with an error. The program will also terminate with an error if information for a reach is specified more than once. tagged: false + index: true pk: true cellid: type: array @@ -372,6 +373,7 @@ blocks: equal to NREACHES. The program will also terminate with an error if table information for a reach is specified more than once. tagged: false + index: true fk: packagedata.ifno tab6: type: keyword @@ -407,6 +409,7 @@ blocks: will terminate with an error. The program will also terminate with an error if connection information for a reach is specified more than once. tagged: false + index: true fk: packagedata.ifno ic: type: array @@ -421,6 +424,7 @@ blocks: optional: true tagged: false dtype: integer + index: true shape: - packagedata.ncon(ifno) diversions: @@ -440,6 +444,7 @@ blocks: with an error if diversion information for a given reach diversion is specified more than once. tagged: false + index: true fk: packagedata.ifno idv: type: integer @@ -448,6 +453,7 @@ blocks: for reach IFNO. IDV must be greater than zero and less than or equal to NDV for reach IFNO. tagged: false + index: true iconr: type: integer longname: downstream reach number for diversion @@ -455,6 +461,7 @@ blocks: water. IDV must be greater than zero and less than or equal to NREACHES. Furthermore, reach ICONR must be a downstream connection for reach IFNO. tagged: false + index: true cprior: type: string longname: iprior code @@ -493,6 +500,7 @@ blocks: terminate with an error. The program will also terminate with a error if IFNO is less than one or greater than NREACHES. tagged: false + index: true fk: packagedata.ifno initialstage: type: double @@ -516,6 +524,7 @@ blocks: description: integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES. tagged: false + index: true fk: packagedata.ifno sfrsetting: type: union @@ -621,6 +630,7 @@ blocks: description: an integer value specifying which diversion of reach IFNO that DIVFLOW is being specified for. Must be less or equal to ndv for the current reach (IFNO). tagged: false + index: true divflow: type: double longname: volumetric diversion flow rate diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.json index ff42b9ca..8c869a59 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.json @@ -245,6 +245,7 @@ "longname": "uzf id number for this entry", "description": "integer value that defines the feature (UZF object) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. UZF information must be specified for every UZF cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once.", "tagged": false, + "index": true, "pk": true }, "cellid": { @@ -267,7 +268,8 @@ "type": "integer", "longname": "vertical connection flag", "description": "integer value set to specify underlying UZF cell that receives water flowing to bottom of cell. If unsaturated zone flow reaches the water table before the cell bottom, then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell.", - "tagged": false + "tagged": false, + "index": true }, "surfdep": { "type": "double", @@ -332,6 +334,7 @@ "longname": "UZF id number", "description": "integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "finf": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.toml index 3bf1a9c4..794b9abe 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.toml @@ -224,6 +224,7 @@ type = "integer" longname = "uzf id number for this entry" description = "integer value that defines the feature (UZF object) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. UZF information must be specified for every UZF cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.cellid] @@ -247,6 +248,7 @@ type = "integer" longname = "vertical connection flag" description = "integer value set to specify underlying UZF cell that receives water flowing to bottom of cell. If unsaturated zone flow reaches the water table before the cell bottom, then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell." tagged = false +index = true [blocks.packagedata.fields.packagedata.item.fields.surfdep] type = "double" @@ -302,6 +304,7 @@ type = "integer" longname = "UZF id number" description = "integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.finf] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.yaml index 9910c70f..779b71fb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.yaml @@ -240,6 +240,7 @@ blocks: will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once. tagged: false + index: true pk: true cellid: type: array @@ -268,6 +269,7 @@ blocks: then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell. tagged: false + index: true surfdep: type: double longname: surface depression depth @@ -330,6 +332,7 @@ blocks: description: integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line. tagged: false + index: true fk: packagedata.ifno finf: type: string diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.json index 03d5a3e6..65aa6237 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.json @@ -97,6 +97,7 @@ "longname": "species number for this entry", "description": "integer value that defines the species number associated with the specified PACKAGEDATA data entered on each line. IVISCSPECIES must be greater than zero and less than or equal to NVISCSPECIES. Information must be specified for each of the NVISCSPECIES species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once.", "tagged": false, + "index": true, "pk": true }, "dviscdc": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.toml index b6e07adf..0f8bcfb9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.toml @@ -86,6 +86,7 @@ type = "integer" longname = "species number for this entry" description = "integer value that defines the species number associated with the specified PACKAGEDATA data entered on each line. IVISCSPECIES must be greater than zero and less than or equal to NVISCSPECIES. Information must be specified for each of the NVISCSPECIES species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.dviscdc] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.yaml index 10bc101e..5cf12daf 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-vsc.yaml @@ -97,6 +97,7 @@ blocks: species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once. tagged: false + index: true pk: true dviscdc: type: double diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.json index 2dc372b9..4a631786 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.json @@ -172,6 +172,7 @@ "longname": "grid connectivity", "description": "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWT cells and their connections to the other GWT cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code.", "dtype": "integer", + "index": true, "shape": [ "nja" ] @@ -228,7 +229,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -263,7 +265,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -289,6 +292,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.toml index 9ab8922a..d55b4f6a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.toml @@ -153,6 +153,7 @@ type = "array" longname = "grid connectivity" description = "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWT cells and their connections to the other GWT cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code." dtype = "integer" +index = true shape = [ "nja", ] @@ -210,6 +211,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -239,6 +241,7 @@ type = "integer" longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -264,6 +267,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.yaml index f44d7ba1..dc064681 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.yaml @@ -177,6 +177,7 @@ blocks: cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code. dtype: integer + index: true shape: - nja ihc: @@ -246,6 +247,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -273,6 +275,7 @@ blocks: description: is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -296,6 +299,7 @@ blocks: used to define the cell. Vertices must be listed in clockwise order. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.json index ae0eafd5..419b6b8d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.json @@ -186,7 +186,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -220,7 +221,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -246,6 +248,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.toml index b3d08e78..6203384b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.toml @@ -170,6 +170,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -198,6 +199,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -223,6 +225,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.yaml index 98bea1e3..f7f1285d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.yaml @@ -178,6 +178,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -204,6 +205,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -228,6 +230,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.json index 76bb9f3f..38774d4c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.json @@ -165,6 +165,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the feature (lake) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -209,6 +210,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the feature (lake) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NLAKES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "laksetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.toml index 49dd61c4..63f175f7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.toml @@ -147,6 +147,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the feature (lake) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -185,6 +186,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the feature (lake) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NLAKES." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.lakeperioddata.item.fields.laksetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.yaml index 4a4f3743..d9fea94a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-lkt.yaml @@ -162,6 +162,7 @@ blocks: with an error. The program will also terminate with an error if information for a lake is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -204,6 +205,7 @@ blocks: description: integer value that defines the feature (lake) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NLAKES. tagged: false + index: true fk: packagedata.ifno laksetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.json index 50ca0508..2f6a8d70 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.json @@ -165,6 +165,7 @@ "longname": "well number for this entry", "description": "integer value that defines the feature (well) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -209,6 +210,7 @@ "longname": "well number for this entry", "description": "integer value that defines the feature (well) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "mwtsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.toml index d4d4106a..5dced353 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.toml @@ -147,6 +147,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the feature (well) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -185,6 +186,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the feature (well) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.mwtperioddata.item.fields.mwtsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.yaml index 7fcff2e8..f94df3fe 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-mwt.yaml @@ -162,6 +162,7 @@ blocks: with an error. The program will also terminate with an error if information for a well is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -204,6 +205,7 @@ blocks: description: integer value that defines the feature (well) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. tagged: false + index: true fk: packagedata.ifno mwtsetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.json index ecc1199f..f9e97848 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.json @@ -165,6 +165,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -209,6 +210,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "reachsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.toml index 7373da20..dac3fde2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.toml @@ -147,6 +147,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -185,6 +186,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.reachperioddata.item.fields.reachsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.yaml index 1005becc..e1ba6791 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-sft.yaml @@ -162,6 +162,7 @@ blocks: with an error. The program will also terminate with an error if information for a reach is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -204,6 +205,7 @@ blocks: description: integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES. tagged: false + index: true fk: packagedata.ifno reachsetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.json index a76449d1..fa41568a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.json @@ -165,6 +165,7 @@ "longname": "UZF cell number for this entry", "description": "integer value that defines the feature (UZF object) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. Unsaturated zone flow information must be specified for every UZF cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -209,6 +210,7 @@ "longname": "unsaturated zone flow cell number for this entry", "description": "integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "uztsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.toml index 34d74c51..3bb5c7aa 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.toml @@ -147,6 +147,7 @@ type = "integer" longname = "UZF cell number for this entry" description = "integer value that defines the feature (UZF object) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. Unsaturated zone flow information must be specified for every UZF cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -185,6 +186,7 @@ type = "integer" longname = "unsaturated zone flow cell number for this entry" description = "integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.uztperioddata.item.fields.uztsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.yaml index 522a18b1..8b39c1a5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-uzt.yaml @@ -163,6 +163,7 @@ blocks: cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -207,6 +208,7 @@ blocks: the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. tagged: false + index: true fk: packagedata.ifno uztsetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.json index f98432e6..b1b5e423 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.json @@ -97,7 +97,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.toml index 6e0a6740..720007e6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.toml @@ -87,6 +87,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.yaml index 246c7056..337a346b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cdb.yaml @@ -100,6 +100,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.json index d93184e6..2b4d9260 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.json @@ -50,6 +50,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once.", "tagged": false, + "index": true, "pk": true }, "nxspoints": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.toml index 7aec3698..56a82c5c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.toml @@ -41,6 +41,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.nxspoints] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.yaml index 48c92e86..8a536525 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-cxs.yaml @@ -46,6 +46,7 @@ blocks: with an error. The program will also terminate with an error if information for a section is specified more than once. tagged: false + index: true pk: true nxspoints: type: integer diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json index bcfe40b5..0517c9d0 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json @@ -93,6 +93,7 @@ "description": "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide.", "optional": true, "dtype": "integer", + "index": true, "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml index 38b963c4..829413e0 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml @@ -84,6 +84,7 @@ longname = "cross section number" description = "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide." optional = true dtype = "integer" +index = true shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml index 1d651725..db8300c7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml @@ -101,5 +101,6 @@ blocks: that applies to the reach. If not provided then reach will be treated as hydraulically wide. optional: true dtype: integer + index: true shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json index 54392820..6721ee54 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json @@ -155,7 +155,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -189,7 +190,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "fdc": { "type": "double", @@ -209,6 +211,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml index 46578931..4de40e8d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml @@ -141,6 +141,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -169,6 +170,7 @@ type = "integer" longname = "cell2d number" description = "is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.fdc] type = "double" @@ -188,6 +190,7 @@ longname = "number of cell vertices" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml index 61389eff..33e4fceb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml @@ -147,6 +147,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -173,6 +174,7 @@ blocks: description: is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last. tagged: false + index: true fdc: type: double longname: fractional distance to the cell center @@ -197,6 +199,7 @@ blocks: is calculated using the ZV of the first and last vertex point and FDC. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.json index b98b8540..50cdf417 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.json @@ -133,7 +133,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -167,7 +168,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -193,6 +195,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.toml index 1b9714c7..91612490 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.toml @@ -119,6 +119,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -147,6 +148,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -172,6 +174,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.yaml index 4530b260..1f7e31e2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.yaml @@ -130,6 +130,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -156,6 +157,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -180,6 +182,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.json index a7ba2e0e..817ff124 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.json @@ -115,7 +115,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.toml index 2e3ddb03..59c44c30 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.toml @@ -103,6 +103,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.yaml index e7a1aeae..cc9db2b0 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.yaml @@ -116,6 +116,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.json index b10c9506..eecd573a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.json @@ -183,7 +183,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -217,7 +218,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -243,6 +245,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.toml index b0f991d9..19d47ee6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.toml @@ -167,6 +167,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -195,6 +196,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -220,6 +222,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.yaml index a6d69f1f..b7b8feb1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.yaml @@ -174,6 +174,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -200,6 +201,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -224,6 +226,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.json index 8e10de45..22852d31 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.json @@ -236,6 +236,7 @@ "longname": "PRP id number for release point", "description": "integer value that defines the PRP release point number associated with the specified PACKAGEDATA data on the line. IRPTNO must be greater than zero and less than or equal to NRELEASEPTS. The program will terminate with an error if information for a PRP release point number is specified more than once.", "tagged": false, + "index": true, "pk": true }, "cellid": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.toml index 51d195e5..721f133f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.toml @@ -219,6 +219,7 @@ type = "integer" longname = "PRP id number for release point" description = "integer value that defines the PRP release point number associated with the specified PACKAGEDATA data on the line. IRPTNO must be greater than zero and less than or equal to NRELEASEPTS. The program will terminate with an error if information for a PRP release point number is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.cellid] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.yaml index ec7ddbb1..02382856 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-prp.yaml @@ -253,6 +253,7 @@ blocks: or equal to NRELEASEPTS. The program will terminate with an error if information for a PRP release point number is specified more than once. tagged: false + index: true pk: true cellid: type: array diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.json index defe76d9..b61e5d12 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.json @@ -97,7 +97,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.toml index c615681c..97b407e0 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.toml @@ -87,6 +87,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.yaml index 97ca1c8e..2eb20c39 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cdb.yaml @@ -101,6 +101,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.json index 72422e5b..f14bcaad 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.json @@ -50,6 +50,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once.", "tagged": false, + "index": true, "pk": true }, "nxspoints": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.toml index 3bab57b8..d7de3976 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.toml @@ -41,6 +41,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.nxspoints] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.yaml index 16c3d36f..66bca50f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-cxs.yaml @@ -46,6 +46,7 @@ blocks: with an error. The program will also terminate with an error if information for a section is specified more than once. tagged: false + index: true pk: true nxspoints: type: integer diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json index 8ecf1543..1376ca8e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json @@ -93,6 +93,7 @@ "description": "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide.", "optional": true, "dtype": "integer", + "index": true, "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml index a09e3d70..a2d27e50 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml @@ -84,6 +84,7 @@ longname = "cross section number" description = "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide." optional = true dtype = "integer" +index = true shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml index df1d10cb..f3c6922c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml @@ -101,5 +101,6 @@ blocks: that applies to the reach. If not provided then reach will be treated as hydraulically wide. optional: true dtype: integer + index: true shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json index 5ccef031..38d931ea 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json @@ -145,7 +145,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -179,7 +180,8 @@ "type": "integer", "longname": "cell1d number", "description": "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "fdc": { "type": "double", @@ -199,6 +201,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml index ed4de5ea..617133ec 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml @@ -131,6 +131,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -159,6 +160,7 @@ type = "integer" longname = "cell1d number" description = "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell1d.fields.cell1d.item.fields.fdc] type = "double" @@ -178,6 +180,7 @@ longname = "number of cell vertices" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml index 97c8abd7..7d7bb7bb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml @@ -139,6 +139,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -165,6 +166,7 @@ blocks: description: is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last. tagged: false + index: true fdc: type: double longname: fractional distance to the cell center @@ -189,6 +191,7 @@ blocks: is calculated using the ZV of the first and last vertex point and FDC. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.json index 7adf38f3..1008e13b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.json @@ -133,7 +133,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -167,7 +168,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -193,6 +195,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.toml index 0e9cd323..c0ebe951 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.toml @@ -119,6 +119,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -147,6 +148,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -172,6 +174,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.yaml index bbd16948..cbe69457 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.yaml @@ -130,6 +130,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -156,6 +157,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -180,6 +182,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.json index 68bb1847..a560c2ba 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.json @@ -115,7 +115,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.toml index 6f1ff3a5..46547f93 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.toml @@ -103,6 +103,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.yaml index c20c90f9..fbe69562 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.yaml @@ -117,6 +117,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.json index 756ccdcc..7b17bd1c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.json @@ -34,6 +34,7 @@ "longname": "stress period indicator", "description": "is the period number to apply the adaptive time stepping. Adaptive time stepping is only activated for those periods with a corresponding iperats entry in the perioddata block. The remaining ATS values on this line will apply to period iperats. iperats must be greater than zero. A warning is printed if iperats is greater than nper.", "tagged": false, + "index": true, "pk": true }, "dt0": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.toml index f0a7b508..d02c2806 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.toml @@ -26,6 +26,7 @@ type = "integer" longname = "stress period indicator" description = "is the period number to apply the adaptive time stepping. Adaptive time stepping is only activated for those periods with a corresponding iperats entry in the perioddata block. The remaining ATS values on this line will apply to period iperats. iperats must be greater than zero. A warning is printed if iperats is greater than nper." tagged = false +index = true pk = true [blocks.perioddata.fields.perioddata.item.fields.dt0] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.yaml index 718eff39..ef66c81d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-ats.yaml @@ -32,6 +32,7 @@ blocks: block. The remaining ATS values on this line will apply to period iperats. iperats must be greater than zero. A warning is printed if iperats is greater than nper. tagged: false + index: true pk: true dt0: type: double diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.json index cc864a4e..a450fe4e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.json @@ -61,6 +61,7 @@ "longname": "bound number for this entry", "description": "integer value that defines the boundary package feature number associated with the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND.", "tagged": false, + "index": true, "pk": true }, "spcsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.toml index 2f96107a..d3954fd7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.toml @@ -50,6 +50,7 @@ type = "integer" longname = "bound number for this entry" description = "integer value that defines the boundary package feature number associated with the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND." tagged = false +index = true pk = true [blocks.period.fields.perioddata.item.fields.spcsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.yaml index 8e442053..eb4fd3d9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/utl-spc.yaml @@ -54,6 +54,7 @@ blocks: the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND. tagged: false + index: true pk: true spcsetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.json index e6969f31..7ad3b777 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.json @@ -106,7 +106,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.toml index 0b5390cb..52bd26c7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.toml @@ -96,6 +96,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.yaml index 3cbcf911..81db6294 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.yaml @@ -106,6 +106,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.json index 1df8dd7d..b66841e7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.json @@ -50,6 +50,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once.", "tagged": false, + "index": true, "pk": true }, "nxspoints": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.toml index a8c87a6c..d4158728 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.toml @@ -41,6 +41,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.nxspoints] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.yaml index b0f91302..7fc39dab 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cxs.yaml @@ -46,6 +46,7 @@ blocks: with an error. The program will also terminate with an error if information for a section is specified more than once. tagged: false + index: true pk: true nxspoints: type: integer diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json index 7dfefc6d..ef0a52a4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json @@ -98,6 +98,7 @@ "description": "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide.", "optional": true, "dtype": "integer", + "index": true, "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml index 541ef12f..ee703e1f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml @@ -87,6 +87,7 @@ longname = "cross section number" description = "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide." optional = true dtype = "integer" +index = true shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml index 799d8fef..53512f24 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml @@ -104,6 +104,7 @@ blocks: that applies to the reach. If not provided then reach will be treated as hydraulically wide. optional: true dtype: integer + index: true shape: - nodes memory: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json index 4dc2b0a2..5810342e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json @@ -145,7 +145,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -179,7 +180,8 @@ "type": "integer", "longname": "cell1d number", "description": "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "fdc": { "type": "double", @@ -199,6 +201,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml index 69ae1342..c91cdb98 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml @@ -131,6 +131,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -159,6 +160,7 @@ type = "integer" longname = "cell1d number" description = "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell1d.fields.cell1d.item.fields.fdc] type = "double" @@ -178,6 +180,7 @@ longname = "number of cell vertices" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml index eba0b2f4..d2f50ca3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml @@ -139,6 +139,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -165,6 +166,7 @@ blocks: description: is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last. tagged: false + index: true fdc: type: double longname: fractional distance to the cell center @@ -189,6 +191,7 @@ blocks: is calculated using the ZV of the first and last vertex point and FDC. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.json index 3bb79933..e0767e78 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.json @@ -124,7 +124,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.toml index 25524317..304b2573 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.toml @@ -112,6 +112,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.yaml index bb89214c..1ff4e55a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.yaml @@ -122,6 +122,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.json index 0c9bb637..2da96fa8 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.json @@ -73,13 +73,15 @@ "type": "integer", "longname": "cellid of cell in surface water model", "description": "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm2": { "type": "integer", "longname": "cellid of cell in groundwater model", "description": "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "bedleak": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.toml index a8bbc890..1e3f3baa 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.toml @@ -63,12 +63,14 @@ type = "integer" longname = "cellid of cell in surface water model" description = "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" longname = "cellid of cell in groundwater model" description = "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.bedleak] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.yaml index 71bbd298..14666271 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.yaml @@ -69,6 +69,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false + index: true cellidm2: type: integer longname: cellid of cell in groundwater model @@ -78,6 +79,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false + index: true bedleak: type: double longname: bed leakance diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.json index e1503513..d0771922 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.json @@ -149,13 +149,15 @@ "type": "integer", "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.toml index bf8765d9..e0ba501f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.toml @@ -137,12 +137,14 @@ type = "integer" longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.yaml index b7e00f6b..70c71fb7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.yaml @@ -150,6 +150,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false + index: true cellidm2: type: integer longname: cellid of second cell @@ -159,6 +160,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false + index: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.json index 1d82f46a..4297ce4e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.json @@ -176,13 +176,15 @@ "type": "integer", "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.toml index 8170dcb9..a06fcf0c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.toml @@ -160,12 +160,14 @@ type = "integer" longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.yaml index 69976659..9195e738 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.yaml @@ -195,6 +195,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false + index: true cellidm2: type: integer longname: cellid of second cell @@ -204,6 +205,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false + index: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.json index f675993a..8ea74436 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.json @@ -149,13 +149,15 @@ "type": "integer", "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.toml index 133746e1..f797f855 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.toml @@ -137,12 +137,14 @@ type = "integer" longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.yaml index 0f9a2f14..ad972507 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.yaml @@ -148,6 +148,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false + index: true cellidm2: type: integer longname: cellid of second cell @@ -157,6 +158,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false + index: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.json index 91d78e4c..606ff54c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.json @@ -73,13 +73,15 @@ "type": "integer", "longname": "cellid of cell in surface water model", "description": "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm2": { "type": "integer", "longname": "cellid of cell in groundwater model", "description": "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "bedleak": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.toml index 4d25d015..aa016c22 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.toml @@ -63,12 +63,14 @@ type = "integer" longname = "cellid of cell in surface water model" description = "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" longname = "cellid of cell in groundwater model" description = "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false +index = true [blocks.exchangedata.fields.exchangedata.item.fields.bedleak] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.yaml index dd14a5ed..d5c7a069 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.yaml @@ -69,6 +69,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false + index: true cellidm2: type: integer longname: cellid of cell in groundwater model @@ -78,6 +79,7 @@ blocks: number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false + index: true bedleak: type: double longname: bed leakance diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.json index b257dd7b..c1b0db52 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.json @@ -175,6 +175,7 @@ "longname": "grid connectivity", "description": "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWE cells and their connections to the other GWE cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code.", "dtype": "integer", + "index": true, "shape": [ "nja" ] @@ -230,7 +231,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -264,7 +266,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -290,6 +293,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.toml index 8589b45d..85724b36 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.toml @@ -156,6 +156,7 @@ type = "array" longname = "grid connectivity" description = "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWE cells and their connections to the other GWE cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code." dtype = "integer" +index = true shape = [ "nja", ] @@ -212,6 +213,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -240,6 +242,7 @@ type = "integer" longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -265,6 +268,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.yaml index f1e0b01d..1a43d294 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.yaml @@ -179,6 +179,7 @@ blocks: cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code. dtype: integer + index: true shape: - nja ihc: @@ -247,6 +248,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -273,6 +275,7 @@ blocks: description: is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -296,6 +299,7 @@ blocks: used to define the cell. Vertices must be listed in clockwise order. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.json index b95a184c..8f6f8914 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.json @@ -186,7 +186,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -220,7 +221,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -246,6 +248,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.toml index c12caa01..2fe544da 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.toml @@ -170,6 +170,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -198,6 +199,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -223,6 +225,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.yaml index c0894511..d3582468 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.yaml @@ -178,6 +178,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -204,6 +205,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -228,6 +230,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.json index 388e3be7..b49d12c4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.json @@ -168,6 +168,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the lake number associated with the specified PACKAGEDATA data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -224,6 +225,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the lake number associated with the specified PERIOD data on the line. LAKENO must be greater than zero and less than or equal to NLAKES.", "tagged": false, + "index": true, "fk": "packagedata.lakeno" }, "laksetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.toml index 0d331bf9..08611de0 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.toml @@ -150,6 +150,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the lake number associated with the specified PACKAGEDATA data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -200,6 +201,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the lake number associated with the specified PERIOD data on the line. LAKENO must be greater than zero and less than or equal to NLAKES." tagged = false +index = true fk = "packagedata.lakeno" [blocks.period.fields.lakeperioddata.item.fields.laksetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.yaml index 23bcba9e..a4f7df81 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-lke.yaml @@ -164,6 +164,7 @@ blocks: program will also terminate with an error if information for a lake is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -218,6 +219,7 @@ blocks: description: integer value that defines the lake number associated with the specified PERIOD data on the line. LAKENO must be greater than zero and less than or equal to NLAKES. tagged: false + index: true fk: packagedata.lakeno laksetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.json index b203f5f1..b6b39d4c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.json @@ -168,6 +168,7 @@ "longname": "well number for this entry", "description": "integer value that defines the well number associated with the specified PACKAGEDATA data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -224,6 +225,7 @@ "longname": "well number for this entry", "description": "integer value that defines the well number associated with the specified PERIOD data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS.", "tagged": false, + "index": true, "fk": "packagedata.mawno" }, "mwesetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.toml index 4a83b912..2d5ef2df 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.toml @@ -150,6 +150,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the well number associated with the specified PACKAGEDATA data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -200,6 +201,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the well number associated with the specified PERIOD data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS." tagged = false +index = true fk = "packagedata.mawno" [blocks.period.fields.mweperioddata.item.fields.mwesetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.yaml index 809bcf9a..7b9eafd6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-mwe.yaml @@ -164,6 +164,7 @@ blocks: error. The program will also terminate with an error if information for a well is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -218,6 +219,7 @@ blocks: description: integer value that defines the well number associated with the specified PERIOD data on the line. MAWNO must be greater than zero and less than or equal to NMAWWELLS. tagged: false + index: true fk: packagedata.mawno mwesetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.json index 1e31246a..84ed1e57 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.json @@ -168,6 +168,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the reach number associated with the specified PACKAGEDATA data on the line. RNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -224,6 +225,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the reach number associated with the specified PERIOD data on the line. RNO must be greater than zero and less than or equal to NREACHES.", "tagged": false, + "index": true, "fk": "packagedata.rno" }, "reachsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.toml index c457c05e..d9354e79 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.toml @@ -150,6 +150,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the reach number associated with the specified PACKAGEDATA data on the line. RNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -200,6 +201,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the reach number associated with the specified PERIOD data on the line. RNO must be greater than zero and less than or equal to NREACHES." tagged = false +index = true fk = "packagedata.rno" [blocks.period.fields.reachperioddata.item.fields.reachsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.yaml index 8a6a26be..77c59894 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-sfe.yaml @@ -165,6 +165,7 @@ blocks: program will also terminate with an error if information for a reach is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -219,6 +220,7 @@ blocks: description: integer value that defines the reach number associated with the specified PERIOD data on the line. RNO must be greater than zero and less than or equal to NREACHES. tagged: false + index: true fk: packagedata.rno reachsetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.json index cabd0daf..41aa7a4b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.json @@ -168,6 +168,7 @@ "longname": "UZF cell number for this entry", "description": "integer value that defines the UZF cell number associated with the specified PACKAGEDATA data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS. Unsaturated zone flow information must be specified for every UZF cell or the program will terminate with an error. The program also will terminate with an error if information for a UZF cell is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -212,6 +213,7 @@ "longname": "unsaturated zone flow cell number for this entry", "description": "integer value that defines the UZF cell number associated with the specified PERIOD data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS.", "tagged": false, + "index": true, "fk": "packagedata.uzfno" }, "uzesetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.toml index 0ea59483..cdb636cf 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.toml @@ -150,6 +150,7 @@ type = "integer" longname = "UZF cell number for this entry" description = "integer value that defines the UZF cell number associated with the specified PACKAGEDATA data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS. Unsaturated zone flow information must be specified for every UZF cell or the program will terminate with an error. The program also will terminate with an error if information for a UZF cell is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -188,6 +189,7 @@ type = "integer" longname = "unsaturated zone flow cell number for this entry" description = "integer value that defines the UZF cell number associated with the specified PERIOD data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS." tagged = false +index = true fk = "packagedata.uzfno" [blocks.period.fields.uzeperioddata.item.fields.uzesetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.yaml index 9a35ce61..63056a0b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-uze.yaml @@ -165,6 +165,7 @@ blocks: program will terminate with an error. The program also will terminate with an error if information for a UZF cell is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -208,6 +209,7 @@ blocks: description: integer value that defines the UZF cell number associated with the specified PERIOD data on the line. UZFNO must be greater than zero and less than or equal to NUZFCELLS. tagged: false + index: true fk: packagedata.uzfno uzesetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.json index 8426d48a..f3cd04a4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.json @@ -73,6 +73,7 @@ "longname": "species number for this entry", "description": "integer value that defines the species number associated with the specified PACKAGEDATA data on the line. IRHOSPECIES must be greater than zero and less than or equal to NRHOSPECIES. Information must be specified for each of the NRHOSPECIES species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once.", "tagged": false, + "index": true, "pk": true }, "drhodc": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.toml index dc45f78a..4b6b0870 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.toml @@ -62,6 +62,7 @@ type = "integer" longname = "species number for this entry" description = "integer value that defines the species number associated with the specified PACKAGEDATA data on the line. IRHOSPECIES must be greater than zero and less than or equal to NRHOSPECIES. Information must be specified for each of the NRHOSPECIES species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.drhodc] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.yaml index f3fd6d1d..a70db235 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-buy.yaml @@ -71,6 +71,7 @@ blocks: program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once. tagged: false + index: true pk: true drhodc: type: double diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.json index 50daefed..d9388898 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.json @@ -393,6 +393,7 @@ "longname": "CSUB id number for this entry", "description": "integer value that defines the CSUB interbed number associated with the specified PACKAGEDATA data on the line. CSUBNO must be greater than zero and less than or equal to NINTERBEDS. CSUB information must be specified for every CSUB cell or the program will terminate with an error. The program will also terminate with an error if information for a CSUB interbed number is specified more than once.", "tagged": false, + "index": true, "pk": true }, "cellid": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.toml index 06cc926e..f221431d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.toml @@ -358,6 +358,7 @@ type = "integer" longname = "CSUB id number for this entry" description = "integer value that defines the CSUB interbed number associated with the specified PACKAGEDATA data on the line. CSUBNO must be greater than zero and less than or equal to NINTERBEDS. CSUB information must be specified for every CSUB cell or the program will terminate with an error. The program will also terminate with an error if information for a CSUB interbed number is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.cellid] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.yaml index 20f0504f..370d7491 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-csub.yaml @@ -376,6 +376,7 @@ blocks: will terminate with an error. The program will also terminate with an error if information for a CSUB interbed number is specified more than once. tagged: false + index: true pk: true cellid: type: array diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.json index 31a12a20..1a754d68 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.json @@ -175,6 +175,7 @@ "longname": "grid connectivity", "description": "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWF cells and their connections to the other GWF cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code.", "dtype": "integer", + "index": true, "shape": [ "nja" ] @@ -231,7 +232,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -266,7 +268,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -292,6 +295,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.toml index d8e98ec0..8d0858a3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.toml @@ -156,6 +156,7 @@ type = "array" longname = "grid connectivity" description = "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWF cells and their connections to the other GWF cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code." dtype = "integer" +index = true shape = [ "nja", ] @@ -213,6 +214,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -242,6 +244,7 @@ type = "integer" longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -267,6 +270,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.yaml index 6db044e7..a6eb9dbc 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.yaml @@ -179,6 +179,7 @@ blocks: cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code. dtype: integer + index: true shape: - nja ihc: @@ -248,6 +249,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -275,6 +277,7 @@ blocks: description: is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -298,6 +301,7 @@ blocks: used to define the cell. Vertices must be listed in clockwise order. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.json index 6de02950..019314fb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.json @@ -186,7 +186,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -220,7 +221,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -246,6 +248,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.toml index 29a3046b..0066b2e5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.toml @@ -170,6 +170,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -198,6 +199,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -223,6 +225,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.yaml index b78fd480..cca8fbc9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.yaml @@ -178,6 +178,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -204,6 +205,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -228,6 +230,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.json index 0959a1da..c3b07ae7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.json @@ -118,6 +118,7 @@ "optional": true, "netcdf": true, "dtype": "integer", + "index": true, "shape": [ "ncpl" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.toml index 2f0e12d9..c406a481 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.toml @@ -105,6 +105,7 @@ description = "IEVT is the layer number that defines the layer in each vertical optional = true netcdf = true dtype = "integer" +index = true shape = [ "ncpl", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.yaml index 4fdfb886..e4b425c5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-evta.yaml @@ -121,6 +121,7 @@ blocks: optional: true netcdf: true dtype: integer + index: true shape: - ncpl surface: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.json index 12df9976..3f63771b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.json @@ -61,13 +61,15 @@ "type": "integer", "longname": "GNC cellid n", "description": "is the cellid of the cell, $n$, in which the ghost node is located. For a structured grid that uses the DIS input file, CELLIDN is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDN is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDN is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidm": { "type": "integer", "longname": "GNC cellid n", "description": "is the cellid of the connecting cell, $m$, to which flow occurs from the ghost node. For a structured grid that uses the DIS input file, CELLIDM is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM is the node number for the cell.", - "tagged": false + "tagged": false, + "index": true }, "cellidsj": { "type": "array", @@ -75,6 +77,7 @@ "description": "is the array of CELLIDS for the contributing j cells, which contribute to the interpolated head value at the ghost node. This item contains one CELLID for each of the contributing cells of the ghost node. Note that if the number of actual contributing cells needed by the user is less than NUMALPHAJ for any ghost node, then a dummy CELLID of zero(s) should be inserted with an associated contributing factor of zero. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLID is the layer number and cell2d number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLID is the node number for the cell.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "numalphaj" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.toml index 74d3443d..5dacd98e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.toml @@ -53,12 +53,14 @@ type = "integer" longname = "GNC cellid n" description = "is the cellid of the cell, $n$, in which the ghost node is located. For a structured grid that uses the DIS input file, CELLIDN is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDN is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDN is the node number for the cell." tagged = false +index = true [blocks.gncdata.fields.gncdata.item.fields.cellidm] type = "integer" longname = "GNC cellid n" description = "is the cellid of the connecting cell, $m$, to which flow occurs from the ghost node. For a structured grid that uses the DIS input file, CELLIDM is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM is the node number for the cell." tagged = false +index = true [blocks.gncdata.fields.gncdata.item.fields.cellidsj] type = "array" @@ -66,6 +68,7 @@ longname = "GNC contributing cells" description = "is the array of CELLIDS for the contributing j cells, which contribute to the interpolated head value at the ghost node. This item contains one CELLID for each of the contributing cells of the ghost node. Note that if the number of actual contributing cells needed by the user is less than NUMALPHAJ for any ghost node, then a dummy CELLID of zero(s) should be inserted with an associated contributing factor of zero. For a structured grid that uses the DIS input file, CELLID is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLID is the layer number and cell2d number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLID is the node number for the cell." tagged = false dtype = "integer" +index = true shape = [ "numalphaj", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.yaml index c6adedf0..5e5df3c9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.yaml @@ -63,6 +63,7 @@ blocks: number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDN is the node number for the cell. tagged: false + index: true cellidm: type: integer longname: GNC cellid n @@ -72,6 +73,7 @@ blocks: layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM is the node number for the cell. tagged: false + index: true cellidsj: type: array longname: GNC contributing cells @@ -86,6 +88,7 @@ blocks: CELLID is the node number for the cell. tagged: false dtype: integer + index: true shape: - numalphaj alphasj: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.json index c772b8f3..d743da2f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.json @@ -241,6 +241,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the feature (lake) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -294,13 +295,15 @@ "longname": "lake number for this entry", "description": "integer value that defines the feature (lake) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake connection information must be specified for every lake connection to the GWF model (NLAKECONN) or the program will terminate with an error. The program will also terminate with an error if connection information for a lake connection to the GWF model is specified more than once.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "iconn": { "type": "integer", "longname": "connection number for this entry", "description": "integer value that defines the GWF connection number for this lake connection entry. ICONN must be greater than zero and less than or equal to NLAKECONN for lake IFNO.", - "tagged": false + "tagged": false, + "index": true }, "cellid": { "type": "array", @@ -368,6 +371,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the feature (lake) number associated with the specified TABLES data on the line. IFNO must be greater than zero and less than or equal to NLAKES. The program will terminate with an error if table information for a lake is specified more than once or the number of specified tables is less than NTABLES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "tab6": { @@ -407,6 +411,7 @@ "longname": "outlet number for this entry", "description": "integer value that defines the outlet number associated with the specified OUTLETS data on the line. OUTLETNO must be greater than zero and less than or equal to NOUTLETS. Outlet information must be specified for every outlet or the program will terminate with an error. The program will also terminate with an error if information for a outlet is specified more than once.", "tagged": false, + "index": true, "pk": true }, "lakein": { @@ -414,6 +419,7 @@ "longname": "lake number for upstream lake", "description": "integer value that defines the lake number that outlet is connected to. LAKEIN must be greater than zero and less than or equal to NLAKES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "lakeout": { @@ -421,6 +427,7 @@ "longname": "lake number for downstream lake", "description": "integer value that defines the lake number that outlet discharge from lake outlet OUTLETNO is routed to. LAKEOUT must be greater than or equal to zero and less than or equal to NLAKES. If LAKEOUT is zero, outlet discharge from lake outlet OUTLETNO is discharged to an external boundary.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "couttype": { @@ -484,6 +491,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "status": { @@ -501,6 +509,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "stage": { @@ -519,6 +528,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "rainfall": { @@ -537,6 +547,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "evaporation": { @@ -555,6 +566,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "runoff": { @@ -573,6 +585,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "inflow": { @@ -591,6 +604,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "withdrawal": { @@ -609,6 +623,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "outlets.outletno" }, "rate": { @@ -627,6 +642,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "outlets.outletno" }, "invert": { @@ -645,6 +661,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "outlets.outletno" }, "width": { @@ -663,6 +680,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "outlets.outletno" }, "slope": { @@ -681,6 +699,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "outlets.outletno" }, "rough": { @@ -699,6 +718,7 @@ "longname": "lake or outlet number for this entry", "description": "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "auxiliary": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.toml index cf7c321b..98ff2dde 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.toml @@ -220,6 +220,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the feature (lake) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -267,6 +268,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the feature (lake) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake connection information must be specified for every lake connection to the GWF model (NLAKECONN) or the program will terminate with an error. The program will also terminate with an error if connection information for a lake connection to the GWF model is specified more than once." tagged = false +index = true fk = "packagedata.ifno" [blocks.connectiondata.fields.connectiondata.item.fields.iconn] @@ -274,6 +276,7 @@ type = "integer" longname = "connection number for this entry" description = "integer value that defines the GWF connection number for this lake connection entry. ICONN must be greater than zero and less than or equal to NLAKECONN for lake IFNO." tagged = false +index = true [blocks.connectiondata.fields.connectiondata.item.fields.cellid] type = "array" @@ -335,6 +338,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the feature (lake) number associated with the specified TABLES data on the line. IFNO must be greater than zero and less than or equal to NLAKES. The program will terminate with an error if table information for a lake is specified more than once or the number of specified tables is less than NTABLES." tagged = false +index = true fk = "packagedata.ifno" [blocks.tables.fields.tables.item.fields.tab6] @@ -368,6 +372,7 @@ type = "integer" longname = "outlet number for this entry" description = "integer value that defines the outlet number associated with the specified OUTLETS data on the line. OUTLETNO must be greater than zero and less than or equal to NOUTLETS. Outlet information must be specified for every outlet or the program will terminate with an error. The program will also terminate with an error if information for a outlet is specified more than once." tagged = false +index = true pk = true [blocks.outlets.fields.outlets.item.fields.lakein] @@ -375,6 +380,7 @@ type = "integer" longname = "lake number for upstream lake" description = "integer value that defines the lake number that outlet is connected to. LAKEIN must be greater than zero and less than or equal to NLAKES." tagged = false +index = true fk = "packagedata.ifno" [blocks.outlets.fields.outlets.item.fields.lakeout] @@ -382,6 +388,7 @@ type = "integer" longname = "lake number for downstream lake" description = "integer value that defines the lake number that outlet discharge from lake outlet OUTLETNO is routed to. LAKEOUT must be greater than or equal to zero and less than or equal to NLAKES. If LAKEOUT is zero, outlet discharge from lake outlet OUTLETNO is discharged to an external boundary." tagged = false +index = true fk = "packagedata.ifno" [blocks.outlets.fields.outlets.item.fields.couttype] @@ -436,6 +443,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.status.fields.status] @@ -451,6 +459,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.stage.fields.stage] @@ -467,6 +476,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.rainfall.fields.rainfall] @@ -483,6 +493,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.evaporation.fields.evaporation] @@ -499,6 +510,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.runoff.fields.runoff] @@ -515,6 +527,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.inflow.fields.inflow] @@ -531,6 +544,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.withdrawal.fields.withdrawal] @@ -547,6 +561,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "outlets.outletno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.rate.fields.rate] @@ -563,6 +578,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "outlets.outletno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.invert.fields.invert] @@ -579,6 +595,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "outlets.outletno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.width.fields.width] @@ -595,6 +612,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "outlets.outletno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.slope.fields.slope] @@ -611,6 +629,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "outlets.outletno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.rough.fields.rough] @@ -627,6 +646,7 @@ type = "integer" longname = "lake or outlet number for this entry" description = "integer value that defines the lake or outlet number associated with the specified PERIOD data on the line. NUMBER must be greater than zero and less than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.laksetting.arms.auxiliaryrecord.fields.auxiliary] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.yaml index 7a7a768f..7b8c2326 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-lak.yaml @@ -238,6 +238,7 @@ blocks: with an error. The program will also terminate with an error if information for a lake is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -293,6 +294,7 @@ blocks: also terminate with an error if connection information for a lake connection to the GWF model is specified more than once. tagged: false + index: true fk: packagedata.ifno iconn: type: integer @@ -300,6 +302,7 @@ blocks: description: integer value that defines the GWF connection number for this lake connection entry. ICONN must be greater than zero and less than or equal to NLAKECONN for lake IFNO. tagged: false + index: true cellid: type: array longname: cell identifier @@ -391,6 +394,7 @@ blocks: The program will terminate with an error if table information for a lake is specified more than once or the number of specified tables is less than NTABLES. tagged: false + index: true fk: packagedata.ifno tab6: type: keyword @@ -429,6 +433,7 @@ blocks: with an error. The program will also terminate with an error if information for a outlet is specified more than once. tagged: false + index: true pk: true lakein: type: integer @@ -436,6 +441,7 @@ blocks: description: integer value that defines the lake number that outlet is connected to. LAKEIN must be greater than zero and less than or equal to NLAKES. tagged: false + index: true fk: packagedata.ifno lakeout: type: integer @@ -445,6 +451,7 @@ blocks: or equal to NLAKES. If LAKEOUT is zero, outlet discharge from lake outlet OUTLETNO is discharged to an external boundary. tagged: false + index: true fk: packagedata.ifno couttype: type: string @@ -519,6 +526,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno status: type: string @@ -536,6 +544,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno stage: type: string @@ -557,6 +566,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno rainfall: type: string @@ -578,6 +588,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno evaporation: type: string @@ -599,6 +610,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno runoff: type: string @@ -620,6 +632,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno inflow: type: string @@ -641,6 +654,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno withdrawal: type: string @@ -662,6 +676,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: outlets.outletno rate: type: string @@ -686,6 +701,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: outlets.outletno invert: type: string @@ -707,6 +723,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: outlets.outletno width: type: string @@ -728,6 +745,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: outlets.outletno slope: type: string @@ -749,6 +767,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: outlets.outletno rough: type: string @@ -770,6 +789,7 @@ blocks: than or equal to NLAKES for a lake number and less than or equal to NOUTLETS for an outlet number. tagged: false + index: true fk: packagedata.ifno auxiliary: type: keyword diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.json index 50979bba..bb350b8d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.json @@ -219,6 +219,7 @@ "longname": "well number for this entry", "description": "integer value that defines the feature (well) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Multi-aquifer well information must be specified for every multi-aquifer well or the program will terminate with an error. The program will also terminate with an error if information for a multi-aquifer well is specified more than once.", "tagged": false, + "index": true, "pk": true }, "radius": { @@ -290,13 +291,15 @@ "longname": "well number for this entry", "description": "integer value that defines the feature (well) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Multi-aquifer well connection information must be specified for every multi-aquifer well connection to the GWF model (NGWFNODES) or the program will terminate with an error. The program will also terminate with an error if connection information for a multi-aquifer well connection to the GWF model is specified more than once.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "icon": { "type": "integer", "longname": "connection number", "description": "integer value that defines the GWF connection number for this multi-aquifer well connection entry. ICONN must be greater than zero and less than or equal to NGWFNODES for multi-aquifer well IFNO.", - "tagged": false + "tagged": false, + "index": true }, "cellid": { "type": "array", @@ -349,6 +352,7 @@ "longname": "well number for this entry", "description": "integer value that defines the well number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "mawsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.toml index ad23b399..57acd8f9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.toml @@ -198,6 +198,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the feature (well) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Multi-aquifer well information must be specified for every multi-aquifer well or the program will terminate with an error. The program will also terminate with an error if information for a multi-aquifer well is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.radius] @@ -260,6 +261,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the feature (well) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Multi-aquifer well connection information must be specified for every multi-aquifer well connection to the GWF model (NGWFNODES) or the program will terminate with an error. The program will also terminate with an error if connection information for a multi-aquifer well connection to the GWF model is specified more than once." tagged = false +index = true fk = "packagedata.ifno" [blocks.connectiondata.fields.connectiondata.item.fields.icon] @@ -267,6 +269,7 @@ type = "integer" longname = "connection number" description = "integer value that defines the GWF connection number for this multi-aquifer well connection entry. ICONN must be greater than zero and less than or equal to NGWFNODES for multi-aquifer well IFNO." tagged = false +index = true [blocks.connectiondata.fields.connectiondata.item.fields.cellid] type = "array" @@ -313,6 +316,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the well number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.mawsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.yaml index 8a15b4c8..97e35dd5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-maw.yaml @@ -225,6 +225,7 @@ blocks: or the program will terminate with an error. The program will also terminate with an error if information for a multi-aquifer well is specified more than once. tagged: false + index: true pk: true radius: type: double @@ -319,6 +320,7 @@ blocks: program will also terminate with an error if connection information for a multi-aquifer well connection to the GWF model is specified more than once. tagged: false + index: true fk: packagedata.ifno icon: type: integer @@ -327,6 +329,7 @@ blocks: well connection entry. ICONN must be greater than zero and less than or equal to NGWFNODES for multi-aquifer well IFNO. tagged: false + index: true cellid: type: array longname: cell identifier @@ -397,6 +400,7 @@ blocks: description: integer value that defines the well number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. tagged: false + index: true fk: packagedata.ifno mawsetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.json index 67e89dd1..af45726a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.json @@ -137,7 +137,8 @@ "type": "integer", "longname": "provider reach", "description": "is the identifier for the provider. For the standard boundary packages, the provider identifier is the number of the boundary as it is listed in the package input file. (Note that the order of these boundaries may change by stress period, which must be accounted for in the Mover Package.) So the first well has an identifier of one. The second is two, and so forth. For the advanced packages, the identifier is the reach number (SFR Package), well number (MAW Package), or UZF cell number. For the Lake Package, ID1 is the lake outlet number. Thus, outflows from a single lake can be routed to different streams, for example.", - "tagged": false + "tagged": false, + "index": true }, "mname2": { "type": "string", @@ -156,7 +157,8 @@ "type": "integer", "longname": "receiver reach", "description": "is the identifier for the receiver. The receiver identifier is the reach number (SFR Package), Lake number (LAK Package), well number (MAW Package), or UZF cell number.", - "tagged": false + "tagged": false, + "index": true }, "mvrtype": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.toml index fcc6cd19..c4706e7c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.toml @@ -116,6 +116,7 @@ type = "integer" longname = "provider reach" description = "is the identifier for the provider. For the standard boundary packages, the provider identifier is the number of the boundary as it is listed in the package input file. (Note that the order of these boundaries may change by stress period, which must be accounted for in the Mover Package.) So the first well has an identifier of one. The second is two, and so forth. For the advanced packages, the identifier is the reach number (SFR Package), well number (MAW Package), or UZF cell number. For the Lake Package, ID1 is the lake outlet number. Thus, outflows from a single lake can be routed to different streams, for example." tagged = false +index = true [blocks.period.fields.perioddata.item.fields.mname2] type = "string" @@ -135,6 +136,7 @@ type = "integer" longname = "receiver reach" description = "is the identifier for the receiver. The receiver identifier is the reach number (SFR Package), Lake number (LAK Package), well number (MAW Package), or UZF cell number." tagged = false +index = true [blocks.period.fields.perioddata.item.fields.mvrtype] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.yaml index 2c134db8..3809e22f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-mvr.yaml @@ -131,6 +131,7 @@ blocks: is the lake outlet number. Thus, outflows from a single lake can be routed to different streams, for example. tagged: false + index: true mname2: type: string description: name of model containing the package, PNAME2. @@ -150,6 +151,7 @@ blocks: description: is the identifier for the receiver. The receiver identifier is the reach number (SFR Package), Lake number (LAK Package), well number (MAW Package), or UZF cell number. tagged: false + index: true mvrtype: type: string longname: mover type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.json index a66eed59..a818e29e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.json @@ -118,6 +118,7 @@ "optional": true, "netcdf": true, "dtype": "integer", + "index": true, "shape": [ "ncpl" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.toml index 30feb88d..d679d8a4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.toml @@ -105,6 +105,7 @@ description = "IRCH is the layer number that defines the layer in each vertical optional = true netcdf = true dtype = "integer" +index = true shape = [ "ncpl", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.yaml index 0a19346e..ed5d1c9a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-rcha.yaml @@ -121,6 +121,7 @@ blocks: optional: true netcdf: true dtype: integer + index: true shape: - ncpl recharge: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.json index ecc8f9bb..054ab190 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.json @@ -242,6 +242,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once.", "tagged": false, + "index": true, "pk": true }, "cellid": { @@ -356,6 +357,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified cross-section table file on the line. IFNO must be greater than zero and less than or equal to NREACHES. The program will also terminate with an error if table information for a reach is specified more than once.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "tab6": { @@ -392,6 +394,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach connection information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if connection information for a reach is specified more than once.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "ic": { @@ -401,6 +404,7 @@ "optional": true, "tagged": false, "dtype": "integer", + "index": true, "shape": [ "packagedata.ncon(ifno)" ] @@ -422,19 +426,22 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified DIVERSIONS data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach diversion information must be specified for every reach with a NDV value greater than 0 or the program will terminate with an error. The program will also terminate with an error if diversion information for a given reach diversion is specified more than once.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "idv": { "type": "integer", "longname": "downstream diversion number", "description": "integer value that defines the downstream diversion number for the diversion for reach IFNO. IDV must be greater than zero and less than or equal to NDV for reach IFNO.", - "tagged": false + "tagged": false, + "index": true }, "iconr": { "type": "integer", "longname": "downstream reach number for diversion", "description": "integer value that defines the downstream reach that will receive the diverted water. IDV must be greater than zero and less than or equal to NREACHES. Furthermore, reach ICONR must be a downstream connection for reach IFNO.", - "tagged": false + "tagged": false, + "index": true }, "cprior": { "type": "string", @@ -459,6 +466,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified initial stage. Initial stage data must be specified for every reach or the program will terminate with an error. The program will also terminate with a error if IFNO is less than one or greater than NREACHES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "initialstage": { @@ -484,6 +492,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "sfrsetting": { @@ -549,7 +558,8 @@ "type": "integer", "longname": "diversion number", "description": "an integer value specifying which diversion of reach IFNO that DIVFLOW is being specified for. Must be less or equal to ndv for the current reach (IFNO).", - "tagged": false + "tagged": false, + "index": true }, "divflow": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.toml index be2fab4b..af502092 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.toml @@ -221,6 +221,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.cellid] @@ -326,6 +327,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified cross-section table file on the line. IFNO must be greater than zero and less than or equal to NREACHES. The program will also terminate with an error if table information for a reach is specified more than once." tagged = false +index = true fk = "packagedata.ifno" [blocks.crosssections.fields.crosssections.item.fields.tab6] @@ -356,6 +358,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified CONNECTIONDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach connection information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if connection information for a reach is specified more than once." tagged = false +index = true fk = "packagedata.ifno" [blocks.connectiondata.fields.connectiondata.item.fields.ic] @@ -365,6 +368,7 @@ description = "integer value that defines the reach number of the reach connecte optional = true tagged = false dtype = "integer" +index = true shape = [ "packagedata.ncon(ifno)", ] @@ -380,6 +384,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified DIVERSIONS data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach diversion information must be specified for every reach with a NDV value greater than 0 or the program will terminate with an error. The program will also terminate with an error if diversion information for a given reach diversion is specified more than once." tagged = false +index = true fk = "packagedata.ifno" [blocks.diversions.fields.diversions.item.fields.idv] @@ -387,12 +392,14 @@ type = "integer" longname = "downstream diversion number" description = "integer value that defines the downstream diversion number for the diversion for reach IFNO. IDV must be greater than zero and less than or equal to NDV for reach IFNO." tagged = false +index = true [blocks.diversions.fields.diversions.item.fields.iconr] type = "integer" longname = "downstream reach number for diversion" description = "integer value that defines the downstream reach that will receive the diverted water. IDV must be greater than zero and less than or equal to NREACHES. Furthermore, reach ICONR must be a downstream connection for reach IFNO." tagged = false +index = true [blocks.diversions.fields.diversions.item.fields.cprior] type = "string" @@ -411,6 +418,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified initial stage. Initial stage data must be specified for every reach or the program will terminate with an error. The program will also terminate with a error if IFNO is less than one or greater than NREACHES." tagged = false +index = true fk = "packagedata.ifno" [blocks.initialstages.fields.initialstages.item.fields.initialstage] @@ -430,6 +438,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.sfrsetting] @@ -496,6 +505,7 @@ type = "integer" longname = "diversion number" description = "an integer value specifying which diversion of reach IFNO that DIVFLOW is being specified for. Must be less or equal to ndv for the current reach (IFNO)." tagged = false +index = true [blocks.period.fields.perioddata.item.fields.sfrsetting.arms.diversionrecord.fields.divflow] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.yaml index 8acb8442..2ea554cf 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.yaml @@ -246,6 +246,7 @@ blocks: with an error. The program will also terminate with an error if information for a reach is specified more than once. tagged: false + index: true pk: true cellid: type: array @@ -374,6 +375,7 @@ blocks: equal to NREACHES. The program will also terminate with an error if table information for a reach is specified more than once. tagged: false + index: true fk: packagedata.ifno tab6: type: keyword @@ -409,6 +411,7 @@ blocks: will terminate with an error. The program will also terminate with an error if connection information for a reach is specified more than once. tagged: false + index: true fk: packagedata.ifno ic: type: array @@ -423,6 +426,7 @@ blocks: optional: true tagged: false dtype: integer + index: true shape: - packagedata.ncon(ifno) diversions: @@ -442,6 +446,7 @@ blocks: with an error if diversion information for a given reach diversion is specified more than once. tagged: false + index: true fk: packagedata.ifno idv: type: integer @@ -450,6 +455,7 @@ blocks: for reach IFNO. IDV must be greater than zero and less than or equal to NDV for reach IFNO. tagged: false + index: true iconr: type: integer longname: downstream reach number for diversion @@ -457,6 +463,7 @@ blocks: water. IDV must be greater than zero and less than or equal to NREACHES. Furthermore, reach ICONR must be a downstream connection for reach IFNO. tagged: false + index: true cprior: type: string longname: iprior code @@ -495,6 +502,7 @@ blocks: terminate with an error. The program will also terminate with a error if IFNO is less than one or greater than NREACHES. tagged: false + index: true fk: packagedata.ifno initialstage: type: double @@ -518,6 +526,7 @@ blocks: description: integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES. tagged: false + index: true fk: packagedata.ifno sfrsetting: type: union @@ -623,6 +632,7 @@ blocks: description: an integer value specifying which diversion of reach IFNO that DIVFLOW is being specified for. Must be less or equal to ndv for the current reach (IFNO). tagged: false + index: true divflow: type: double longname: volumetric diversion flow rate diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.json index a4cd651c..f40b2c00 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.json @@ -245,6 +245,7 @@ "longname": "uzf id number for this entry", "description": "integer value that defines the feature (UZF object) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. UZF information must be specified for every UZF cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once.", "tagged": false, + "index": true, "pk": true }, "cellid": { @@ -267,7 +268,8 @@ "type": "integer", "longname": "vertical connection flag", "description": "integer value set to specify underlying UZF cell that receives water flowing to bottom of cell. If unsaturated zone flow reaches the water table before the cell bottom, then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell.", - "tagged": false + "tagged": false, + "index": true }, "surfdep": { "type": "double", @@ -332,6 +334,7 @@ "longname": "UZF id number", "description": "integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "finf": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.toml index 64532d05..72e2db7a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.toml @@ -224,6 +224,7 @@ type = "integer" longname = "uzf id number for this entry" description = "integer value that defines the feature (UZF object) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. UZF information must be specified for every UZF cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.cellid] @@ -247,6 +248,7 @@ type = "integer" longname = "vertical connection flag" description = "integer value set to specify underlying UZF cell that receives water flowing to bottom of cell. If unsaturated zone flow reaches the water table before the cell bottom, then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell." tagged = false +index = true [blocks.packagedata.fields.packagedata.item.fields.surfdep] type = "double" @@ -302,6 +304,7 @@ type = "integer" longname = "UZF id number" description = "integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.perioddata.item.fields.finf] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.yaml index e9026608..759872e9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.yaml @@ -240,6 +240,7 @@ blocks: will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once. tagged: false + index: true pk: true cellid: type: array @@ -268,6 +269,7 @@ blocks: then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell. tagged: false + index: true surfdep: type: double longname: surface depression depth @@ -330,6 +332,7 @@ blocks: description: integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line. tagged: false + index: true fk: packagedata.ifno finf: type: string diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.json index c4b80c52..60e92f13 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.json @@ -97,6 +97,7 @@ "longname": "species number for this entry", "description": "integer value that defines the species number associated with the specified PACKAGEDATA data entered on each line. IVISCSPECIES must be greater than zero and less than or equal to NVISCSPECIES. Information must be specified for each of the NVISCSPECIES species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once.", "tagged": false, + "index": true, "pk": true }, "dviscdc": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.toml index f22ed59d..dd04b930 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.toml @@ -86,6 +86,7 @@ type = "integer" longname = "species number for this entry" description = "integer value that defines the species number associated with the specified PACKAGEDATA data entered on each line. IVISCSPECIES must be greater than zero and less than or equal to NVISCSPECIES. Information must be specified for each of the NVISCSPECIES species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.dviscdc] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.yaml index 162aaf61..7be0f8f2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-vsc.yaml @@ -97,6 +97,7 @@ blocks: species or the program will terminate with an error. The program will also terminate with an error if information for a species is specified more than once. tagged: false + index: true pk: true dviscdc: type: double diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.json index 112ca6b8..e3b2b65c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.json @@ -175,6 +175,7 @@ "longname": "grid connectivity", "description": "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWT cells and their connections to the other GWT cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code.", "dtype": "integer", + "index": true, "shape": [ "nja" ] @@ -231,7 +232,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -266,7 +268,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -292,6 +295,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.toml index 707b0326..db605728 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.toml @@ -156,6 +156,7 @@ type = "array" longname = "grid connectivity" description = "is a list of cell number (n) followed by its connecting cell numbers (m) for each of the m cells connected to cell n. The number of values to provide for cell n is IAC(n). This list is sequentially provided for the first to the last cell. The first value in the list must be cell n itself, and the remaining cells must be listed in an increasing order (sorted from lowest number to highest). Note that the cell and its connections are only supplied for the GWT cells and their connections to the other GWT cells. Also note that the JA list input may be divided such that every node and its connectivity list can be on a separate line for ease in readability of the file. To further ease readability of the file, the node number of the cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code." dtype = "integer" +index = true shape = [ "nja", ] @@ -213,6 +214,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -242,6 +244,7 @@ type = "integer" longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -267,6 +270,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.yaml index c31e2772..938dcc3a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.yaml @@ -179,6 +179,7 @@ blocks: cell whose connectivity is subsequently listed, may be expressed as a negative number, the sign of which is subsequently converted to positive by the code. dtype: integer + index: true shape: - nja ihc: @@ -248,6 +249,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -275,6 +277,7 @@ blocks: description: is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -298,6 +301,7 @@ blocks: used to define the cell. Vertices must be listed in clockwise order. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.json index b91448bb..aa576ec8 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.json @@ -186,7 +186,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -220,7 +221,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -246,6 +248,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.toml index a5abdea6..347480fa 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.toml @@ -170,6 +170,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -198,6 +199,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -223,6 +225,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.yaml index 6eee1636..bde6635a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.yaml @@ -178,6 +178,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -204,6 +205,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -228,6 +230,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.json index 28b89648..e4d62309 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.json @@ -168,6 +168,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the feature (lake) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -212,6 +213,7 @@ "longname": "lake number for this entry", "description": "integer value that defines the feature (lake) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NLAKES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "laksetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.toml index 76d56a5f..4417055a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.toml @@ -150,6 +150,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the feature (lake) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NLAKES. Lake information must be specified for every lake or the program will terminate with an error. The program will also terminate with an error if information for a lake is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -188,6 +189,7 @@ type = "integer" longname = "lake number for this entry" description = "integer value that defines the feature (lake) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NLAKES." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.lakeperioddata.item.fields.laksetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.yaml index 5799bedc..3985de41 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-lkt.yaml @@ -164,6 +164,7 @@ blocks: with an error. The program will also terminate with an error if information for a lake is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -206,6 +207,7 @@ blocks: description: integer value that defines the feature (lake) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NLAKES. tagged: false + index: true fk: packagedata.ifno laksetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.json index cdaad4f0..c693a28d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.json @@ -168,6 +168,7 @@ "longname": "well number for this entry", "description": "integer value that defines the feature (well) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -212,6 +213,7 @@ "longname": "well number for this entry", "description": "integer value that defines the feature (well) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "mwtsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.toml index 941e0a21..62276bab 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.toml @@ -150,6 +150,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the feature (well) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. Well information must be specified for every well or the program will terminate with an error. The program will also terminate with an error if information for a well is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -188,6 +189,7 @@ type = "integer" longname = "well number for this entry" description = "integer value that defines the feature (well) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.mwtperioddata.item.fields.mwtsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.yaml index c323ab91..317f4ee6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-mwt.yaml @@ -164,6 +164,7 @@ blocks: with an error. The program will also terminate with an error if information for a well is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -206,6 +207,7 @@ blocks: description: integer value that defines the feature (well) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NMAWWELLS. tagged: false + index: true fk: packagedata.ifno mwtsetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.json index de13534b..b17316b7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.json @@ -168,6 +168,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -212,6 +213,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "reachsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.toml index 9e255183..2ae30283 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.toml @@ -150,6 +150,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NREACHES. Reach information must be specified for every reach or the program will terminate with an error. The program will also terminate with an error if information for a reach is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -188,6 +189,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.reachperioddata.item.fields.reachsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.yaml index 9326f14f..ef626754 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-sft.yaml @@ -164,6 +164,7 @@ blocks: with an error. The program will also terminate with an error if information for a reach is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -206,6 +207,7 @@ blocks: description: integer value that defines the feature (reach) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NREACHES. tagged: false + index: true fk: packagedata.ifno reachsetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.json index a2ac828b..6fcb9d2d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.json @@ -168,6 +168,7 @@ "longname": "UZF cell number for this entry", "description": "integer value that defines the feature (UZF object) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. Unsaturated zone flow information must be specified for every UZF cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once.", "tagged": false, + "index": true, "pk": true }, "strt": { @@ -212,6 +213,7 @@ "longname": "unsaturated zone flow cell number for this entry", "description": "integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS.", "tagged": false, + "index": true, "fk": "packagedata.ifno" }, "uztsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.toml index fd9918f0..a4927862 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.toml @@ -150,6 +150,7 @@ type = "integer" longname = "UZF cell number for this entry" description = "integer value that defines the feature (UZF object) number associated with the specified PACKAGEDATA data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. Unsaturated zone flow information must be specified for every UZF cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.strt] @@ -188,6 +189,7 @@ type = "integer" longname = "unsaturated zone flow cell number for this entry" description = "integer value that defines the feature (UZF object) number associated with the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS." tagged = false +index = true fk = "packagedata.ifno" [blocks.period.fields.uztperioddata.item.fields.uztsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.yaml index 64d763fb..266ca3cb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-uzt.yaml @@ -165,6 +165,7 @@ blocks: cell or the program will terminate with an error. The program will also terminate with an error if information for a UZF cell is specified more than once. tagged: false + index: true pk: true strt: type: double @@ -209,6 +210,7 @@ blocks: the specified PERIOD data on the line. IFNO must be greater than zero and less than or equal to NUZFCELLS. tagged: false + index: true fk: packagedata.ifno uztsetting: type: union diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.json index ccb8ff95..4270d69d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.json @@ -106,7 +106,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.toml index f1f0d0d2..8499ca3f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.toml @@ -96,6 +96,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.yaml index a4e533f2..3d724b77 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cdb.yaml @@ -106,6 +106,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.json index 5be5d4e3..26db24c4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.json @@ -50,6 +50,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once.", "tagged": false, + "index": true, "pk": true }, "nxspoints": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.toml index eea83ead..942703bd 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.toml @@ -41,6 +41,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.nxspoints] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.yaml index 55895edf..d91cf8aa 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-cxs.yaml @@ -46,6 +46,7 @@ blocks: with an error. The program will also terminate with an error if information for a section is specified more than once. tagged: false + index: true pk: true nxspoints: type: integer diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json index cd24e65c..cdeed938 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json @@ -98,6 +98,7 @@ "description": "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide.", "optional": true, "dtype": "integer", + "index": true, "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml index cdee7ebb..e46af588 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml @@ -87,6 +87,7 @@ longname = "cross section number" description = "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide." optional = true dtype = "integer" +index = true shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml index cd864a46..129e27c6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml @@ -104,6 +104,7 @@ blocks: that applies to the reach. If not provided then reach will be treated as hydraulically wide. optional: true dtype: integer + index: true shape: - nodes memory: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json index c02510d3..5ea422f4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json @@ -155,7 +155,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -189,7 +190,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "fdc": { "type": "double", @@ -209,6 +211,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml index 48192ad4..33009908 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml @@ -141,6 +141,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -169,6 +170,7 @@ type = "integer" longname = "cell2d number" description = "is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.fdc] type = "double" @@ -188,6 +190,7 @@ longname = "number of cell vertices" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml index c834f5ee..07c7adff 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml @@ -147,6 +147,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -173,6 +174,7 @@ blocks: description: is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last. tagged: false + index: true fdc: type: double longname: fractional distance to the cell center @@ -197,6 +199,7 @@ blocks: is calculated using the ZV of the first and last vertex point and FDC. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.json index 70fe9821..db05910f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.json @@ -133,7 +133,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -167,7 +168,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -193,6 +195,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.toml index f1e5c89f..9396bbd7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.toml @@ -119,6 +119,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -147,6 +148,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -172,6 +174,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.yaml index dc0ddbd9..3abecfca 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.yaml @@ -130,6 +130,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -156,6 +157,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -180,6 +182,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.json index b7985d1b..4db55d67 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.json @@ -124,7 +124,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.toml index 99e2913e..0575c75a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.toml @@ -112,6 +112,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.yaml index 7d65a70e..78c708eb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.yaml @@ -122,6 +122,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.json index a9fb5d7b..2b89440b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.json @@ -183,7 +183,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -217,7 +218,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -243,6 +245,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.toml index 84e0714e..11cca056 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.toml @@ -167,6 +167,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -195,6 +196,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -220,6 +222,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.yaml index 210018db..7e7cf00f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.yaml @@ -174,6 +174,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -200,6 +201,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -224,6 +226,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.json index c3a34a0f..0f546b6e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.json @@ -245,6 +245,7 @@ "longname": "PRP id number for release point", "description": "integer value that defines the PRP release point number associated with the specified PACKAGEDATA data on the line. IRPTNO must be greater than zero and less than or equal to NRELEASEPTS. The program will terminate with an error if information for a PRP release point number is specified more than once.", "tagged": false, + "index": true, "pk": true }, "cellid": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.toml index 5017be19..e01e062a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.toml @@ -228,6 +228,7 @@ type = "integer" longname = "PRP id number for release point" description = "integer value that defines the PRP release point number associated with the specified PACKAGEDATA data on the line. IRPTNO must be greater than zero and less than or equal to NRELEASEPTS. The program will terminate with an error if information for a PRP release point number is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.cellid] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.yaml index 57ff4d77..338fa5df 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-prp.yaml @@ -259,6 +259,7 @@ blocks: or equal to NRELEASEPTS. The program will terminate with an error if information for a PRP release point number is specified more than once. tagged: false + index: true pk: true cellid: type: array diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.json index eb1c3ed1..6bc565b1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.json @@ -106,7 +106,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.toml index 06187e1f..4b4226a2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.toml @@ -96,6 +96,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.yaml index a7d18d41..22ae7e02 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cdb.yaml @@ -107,6 +107,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.json index 15e31ec1..ed989271 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.json @@ -50,6 +50,7 @@ "longname": "reach number for this entry", "description": "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once.", "tagged": false, + "index": true, "pk": true }, "nxspoints": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.toml index 60ee0320..26a43ab4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.toml @@ -41,6 +41,7 @@ type = "integer" longname = "reach number for this entry" description = "integer value that defines the cross section number associated with the specified PACKAGEDATA data on the line. IDCXS must be greater than zero and less than or equal to NSECTIONS. Information must be specified for every section or the program will terminate with an error. The program will also terminate with an error if information for a section is specified more than once." tagged = false +index = true pk = true [blocks.packagedata.fields.packagedata.item.fields.nxspoints] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.yaml index 57c9bb4a..a9856936 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-cxs.yaml @@ -46,6 +46,7 @@ blocks: with an error. The program will also terminate with an error if information for a section is specified more than once. tagged: false + index: true pk: true nxspoints: type: integer diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json index c72fda94..443561ae 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json @@ -98,6 +98,7 @@ "description": "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide.", "optional": true, "dtype": "integer", + "index": true, "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml index 5833be7b..1e4acc0d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml @@ -87,6 +87,7 @@ longname = "cross section number" description = "integer value indication the cross section identifier in the Cross Section Package that applies to the reach. If not provided then reach will be treated as hydraulically wide." optional = true dtype = "integer" +index = true shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml index 43cfa2b2..2c7f7a58 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml @@ -104,6 +104,7 @@ blocks: that applies to the reach. If not provided then reach will be treated as hydraulically wide. optional: true dtype: integer + index: true shape: - nodes memory: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json index 3606da5c..a77f7723 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json @@ -145,7 +145,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -179,7 +180,8 @@ "type": "integer", "longname": "cell1d number", "description": "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "fdc": { "type": "double", @@ -199,6 +201,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml index 7bf0ec79..306dc778 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml @@ -131,6 +131,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -159,6 +160,7 @@ type = "integer" longname = "cell1d number" description = "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell1d.fields.cell1d.item.fields.fdc] type = "double" @@ -178,6 +180,7 @@ longname = "number of cell vertices" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in the order that defines the line representing the cell. Cells that are connected must share vertices. The bottom elevation of the cell is calculated using the ZV of the first and last vertex point and FDC." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml index b6d002f4..100d1123 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml @@ -139,6 +139,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -165,6 +166,7 @@ blocks: description: is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last. tagged: false + index: true fdc: type: double longname: fractional distance to the cell center @@ -189,6 +191,7 @@ blocks: is calculated using the ZV of the first and last vertex point and FDC. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.json index 6ff9f72e..cc5d271f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.json @@ -133,7 +133,8 @@ "type": "integer", "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", - "tagged": false + "tagged": false, + "index": true }, "xv": { "type": "double", @@ -167,7 +168,8 @@ "type": "integer", "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", - "tagged": false + "tagged": false, + "index": true }, "xc": { "type": "double", @@ -193,6 +195,7 @@ "description": "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices.", "tagged": false, "dtype": "integer", + "index": true, "shape": [ "ncvert" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.toml index 2bbfecfa..9165cd7a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.toml @@ -119,6 +119,7 @@ type = "integer" longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false +index = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -147,6 +148,7 @@ type = "integer" longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false +index = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" @@ -172,6 +174,7 @@ longname = "array of vertex numbers" description = "is an array of integer values containing vertex numbers (in the VERTICES block) used to define the cell. Vertices must be listed in clockwise order. Cells that are connected must share vertices." tagged = false dtype = "integer" +index = true shape = [ "ncvert", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.yaml index 8703d348..25ebaf06 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.yaml @@ -130,6 +130,7 @@ blocks: description: is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT. tagged: false + index: true xv: type: double longname: x-coordinate for vertex @@ -156,6 +157,7 @@ blocks: description: is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last. tagged: false + index: true xc: type: double longname: x-coordinate for cell center @@ -180,6 +182,7 @@ blocks: connected must share vertices. tagged: false dtype: integer + index: true shape: - ncvert shape: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.json index 7ce43a7e..3fcf388d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.json @@ -124,7 +124,8 @@ "type": "integer", "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", - "tagged": false + "tagged": false, + "index": true }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.toml index 10bc67a4..330e654f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.toml @@ -112,6 +112,7 @@ type = "integer" longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false +index = true [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.yaml index 5f00a49b..1c244fab 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.yaml @@ -123,6 +123,7 @@ blocks: of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel. tagged: false + index: true width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.json index ff89c5d3..43960bce 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.json @@ -34,6 +34,7 @@ "longname": "stress period indicator", "description": "is the period number to apply the adaptive time stepping. Adaptive time stepping is only activated for those periods with a corresponding iperats entry in the perioddata block. The remaining ATS values on this line will apply to period iperats. iperats must be greater than zero. A warning is printed if iperats is greater than nper.", "tagged": false, + "index": true, "pk": true }, "dt0": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.toml index 54df2938..771d14ee 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.toml @@ -26,6 +26,7 @@ type = "integer" longname = "stress period indicator" description = "is the period number to apply the adaptive time stepping. Adaptive time stepping is only activated for those periods with a corresponding iperats entry in the perioddata block. The remaining ATS values on this line will apply to period iperats. iperats must be greater than zero. A warning is printed if iperats is greater than nper." tagged = false +index = true pk = true [blocks.perioddata.fields.perioddata.item.fields.dt0] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.yaml index 2133cfc0..54fe29f3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-ats.yaml @@ -32,6 +32,7 @@ blocks: block. The remaining ATS values on this line will apply to period iperats. iperats must be greater than zero. A warning is printed if iperats is greater than nper. tagged: false + index: true pk: true dt0: type: double diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.json index 636b9d89..2f406e54 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.json @@ -61,6 +61,7 @@ "longname": "bound number for this entry", "description": "integer value that defines the boundary package feature number associated with the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND.", "tagged": false, + "index": true, "pk": true }, "spcsetting": { diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.toml index 77767aa1..92d73e59 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.toml @@ -50,6 +50,7 @@ type = "integer" longname = "bound number for this entry" description = "integer value that defines the boundary package feature number associated with the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND." tagged = false +index = true pk = true [blocks.period.fields.perioddata.item.fields.spcsetting] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.yaml index ffc94882..cf8feed1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/utl-spc.yaml @@ -54,6 +54,7 @@ blocks: the specified PERIOD data on the line. BNDNO must be greater than zero and less than or equal to MAXBOUND. tagged: false + index: true pk: true spcsetting: type: union diff --git a/docs/md/dfnspec.md b/docs/md/dfnspec.md index 0b9deef8..f41155bf 100644 --- a/docs/md/dfnspec.md +++ b/docs/md/dfnspec.md @@ -53,6 +53,7 @@ This document describes the MODFLOW 6 component definition (DFN) system. This sy - [Type-specific attributes](#type-specific-attributes-3) - [`valid`](#valid-1) - [`time_series`](#time_series-1) + - [`index`](#index) - [`pk`](#pk-1) - [`fk`](#fk-1) - [`fk_ref`](#fk_ref-1) @@ -68,6 +69,7 @@ This document describes the MODFLOW 6 component definition (DFN) system. This sy - [`dtype`](#dtype) - [`shape`](#shape) - [`time_series`](#time_series-3) + - [`index`](#index-1) - [Record](#record) - [Type-specific attributes](#type-specific-attributes-7) - [`fields`](#fields-2) @@ -374,6 +376,10 @@ Type `integer`. `boolean (default: false)`. Marks fields where the parser accepts either a numeric literal or a time-series name (referencing a `utl-ts` object). Not inferable from structural type. Also appears on array fields (where it references a `utl-tas` object instead). Note that `utl-tas` currently only works with layered arrays, not full-grid arrays, though generalizing has been considered. +###### `index` + +`boolean (default: false)`. Marks this scalar's value as a 1-based index requiring MF6's 1-based (file) <-> 0-based (Python) translation on read/write. A pure serialization fact, orthogonal to `pk`/`fk`: it does not claim the value identifies or points at a list row, only that it needs the numeric-base conversion. Not valid on `String` scalars — such fields (e.g. dynamic, name-resolved identifiers) never need this conversion. + ###### `pk` `boolean (default: false)`. Marks this scalar as the primary key of its containing list's item record. Valid only on integer or string scalars that are columns in a list item record. Exactly one column per list item may be marked pk. @@ -438,6 +444,10 @@ A 1D array appearing as a subfield of a record is called an **inline array**. In `boolean (default: false)`. Marks fields where the READARRAY invocation may be replaced by a TAS name referencing a `utl-tas` time-array series object. At any model time, the TAS provides an interpolated grid-shaped array. Distinct from the scalar case: references `utl-tas`, not `utl-ts`. Note that `utl-tas` currently only works with layered arrays, not full-grid arrays, though generalizing has been considered. +###### `index` + +`boolean (default: false)`. Marks the array's elements as 1-based indices requiring MF6's 1-based (file) <-> 0-based (Python) translation (e.g. `icvert`, `ja`, `irch`, `ievt`). Only valid when `dtype` is `"integer"`. + #### Record Type `record`. Product type. In MF6 input files, records appear on a single line. Record subfields may or may not be `tagged`. While blocks can be considered product types also, in the DFN specification only records are considered fields; blocks are considered named collections of related fields. diff --git a/index-node-attributes-plan.md b/index-node-attributes-plan.md index 2c6d6fa7..aba48ac8 100644 --- a/index-node-attributes-plan.md +++ b/index-node-attributes-plan.md @@ -111,8 +111,17 @@ Corpus-identified remaining items, from the earlier scan, each independently sch ## Sequencing -- **Phase 1 (now)**: `index` — schema + validator + direct migration. This is the piece that - actually unblocks flopy4 and closes gap #2's practical urgency. Small, mechanical, low-risk. +- **Phase 1 (done, 2026-08-20)**: `index` — schema + validator + direct migration. This is + the piece that actually unblocks flopy4 and closes gap #2's practical urgency. Small, + mechanical, low-risk. Landed: `Integer.index`/`Array.index` in `schema.py` (validator bars + `index=True` off `dtype != "integer"` Arrays; `String` never gets the field at all), + `dfnspec.md` documented, `schema.json` regenerated (also picked up pre-existing unrelated + drift — `removed`/`deprecated`/`layered` on `Array` — as anticipated above), + `migrate_to_v2_0_0_dev2.py` populates `index` directly from v1 `numeric_index` for every + `Integer`/`Array(dtype="integer")` field. Confirmed fixes the `gwf-lak.iconn` regression + from `todo.md`. Full `autotest/dfns/` suite green; snapshots regenerated (306 files, + additive-only diff — every change is a bare `"index": true`/`index = true` addition, no + removals beyond JSON trailing-comma churn). - **Phase 2 (now, small)**: `node` — schema + validator + `fk="node"` removal + the handful of exchange/GNC backfills. Well-scoped enough to go in the same pass as Phase 1. - **Phase 3 (later, incremental, no urgency)**: `pk`/`fk` extensions — lonely-pk allowlist, diff --git a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py index 456e60a7..32f222a6 100644 --- a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py +++ b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py @@ -1049,6 +1049,10 @@ def _map_field(f: v1.Field) -> v2.Field: preserve_case: bool = try_parse_bool(f.get("preserve_case"), False) time_series: bool = try_parse_bool(f.get("time_series"), False) layered: bool = try_parse_bool(f.get("layered"), False) + # Pure serialization fact (1-based/0-based conversion), orthogonal to pk/fk + # relational identity. Direct copy from v1: valid on Integer/Array(dtype= + # "integer") only, never on String (see index-node-attributes-plan.md). + numeric_index: bool = try_parse_bool(f.get("numeric_index"), False) removed: str | None = f.get("removed") or None deprecated: str | None = f.get("deprecated") or None valid = f.get("valid") @@ -1140,6 +1144,7 @@ def _to_scalar() -> v2.Scalar: tagged=tagged, valid=_parse_valid(valid, int), time_series=time_series, + index=numeric_index, ) if _type in ("double", "double precision"): return v2.Double( @@ -1409,6 +1414,7 @@ def _lookup(rname: str) -> dict | None: layered=layered, dtype=dtype, shape=parsed_shape, + index=numeric_index if dtype == "integer" else False, ) return _to_scalar() diff --git a/modflow_devtools/dfns/schema.json b/modflow_devtools/dfns/schema.json index cc043a2a..b005f010 100644 --- a/modflow_devtools/dfns/schema.json +++ b/modflow_devtools/dfns/schema.json @@ -64,6 +64,30 @@ "title": "Tagged", "type": "boolean" }, + "removed": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Removed" + }, + "deprecated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Deprecated" + }, "type": { "const": "array", "default": "array", @@ -92,6 +116,16 @@ "default": false, "title": "Time Series", "type": "boolean" + }, + "layered": { + "default": false, + "title": "Layered", + "type": "boolean" + }, + "index": { + "default": false, + "title": "Index", + "type": "boolean" } }, "required": [ @@ -328,6 +362,30 @@ "title": "Tagged", "type": "boolean" }, + "removed": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Removed" + }, + "deprecated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Deprecated" + }, "type": { "const": "double", "default": "double", @@ -406,6 +464,30 @@ "title": "Tagged", "type": "boolean" }, + "removed": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Removed" + }, + "deprecated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Deprecated" + }, "type": { "const": "file", "default": "file", @@ -488,6 +570,30 @@ "title": "Tagged", "type": "boolean" }, + "removed": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Removed" + }, + "deprecated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Deprecated" + }, "type": { "const": "integer", "default": "integer", @@ -514,6 +620,11 @@ "title": "Time Series", "type": "boolean" }, + "index": { + "default": false, + "title": "Index", + "type": "boolean" + }, "pk": { "default": false, "title": "Pk", @@ -610,6 +721,30 @@ "title": "Tagged", "type": "boolean" }, + "removed": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Removed" + }, + "deprecated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Deprecated" + }, "type": { "const": "keyword", "default": "keyword", @@ -684,6 +819,30 @@ "title": "Tagged", "type": "boolean" }, + "removed": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Removed" + }, + "deprecated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Deprecated" + }, "type": { "const": "list", "default": "list", @@ -1321,6 +1480,30 @@ "title": "Tagged", "type": "boolean" }, + "removed": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Removed" + }, + "deprecated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Deprecated" + }, "type": { "const": "record", "default": "record", @@ -1551,6 +1734,30 @@ "title": "Tagged", "type": "boolean" }, + "removed": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Removed" + }, + "deprecated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Deprecated" + }, "type": { "const": "string", "default": "string", @@ -1678,6 +1885,30 @@ "title": "Tagged", "type": "boolean" }, + "removed": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Removed" + }, + "deprecated": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Deprecated" + }, "type": { "const": "union", "default": "union", diff --git a/modflow_devtools/dfns/schema.py b/modflow_devtools/dfns/schema.py index c4334b11..c75737fc 100644 --- a/modflow_devtools/dfns/schema.py +++ b/modflow_devtools/dfns/schema.py @@ -93,6 +93,10 @@ class Integer(FieldBase): type: Literal["integer"] = PydanticField(default="integer", frozen=True) valid: list[int] | None = None time_series: bool = False + # Pure serialization fact: does this value need MF6's 1-based (file) <-> + # 0-based (Python) translation on read/write? Orthogonal to pk/fk, which + # are about relational identity, not serialization. See docs/md/dfnspec.md. + index: bool = False pk: bool = False fk: str | None = None fk_ref: str | None = None @@ -122,6 +126,18 @@ class Array(FieldBase): shape: list[str] = [] time_series: bool = False layered: bool = False + # Whether the array's elements are 1-based indices needing MF6's + # 1-based (file) <-> 0-based (Python) translation. Only meaningful when + # dtype == "integer"; see docs/md/dfnspec.md. + index: bool = False + + @model_validator(mode="after") + def _check_index_dtype(self) -> "Array": + if self.index and self.dtype != "integer": + raise ValueError( + f"Array {self.name!r}: index=True requires dtype='integer', got {self.dtype!r}" + ) + return self class Record(FieldBase): diff --git a/todo.md b/todo.md index 51905f18..e05bcd9e 100644 --- a/todo.md +++ b/todo.md @@ -58,7 +58,7 @@ `rtype.valid` is populated correctly per component (`['HEAD', 'BUDGET']` for gwf-oc, etc.), sourced from the v1 DFN description text. No migration work needed here. -- [ ] **`numeric_index` → `pk`/`fk` backfill (a838d84, #337) covered fewer fields than the +- [x] **`numeric_index` → `pk`/`fk` backfill (a838d84, #337) covered fewer fields than the v1 corpus actually has flagged.** That fix targeted 6 fields (BUY/CSUB/VSC/PRP/ATS/CXS self-referential primary keys). A full corpus scan (walking v1 DFNs recursively including list/record children, matched by field name against dev3's fully-recursed leaf fields — @@ -84,6 +84,18 @@ like the fix's structural-signal net needs to be wider (or a distinct "index but not a full pk" concept needs a name), not a new bug — flagging so the full 44 get audited under the same pass rather than trickling in one flopy4 regression at a time. + Resolved by decomposing `pk`/`fk`'s conflated "needs 1-based/0-based conversion" + + "is a relational key" concerns into a dedicated `index` attribute — see + `index-node-attributes-plan.md`, Phase 1: added `Integer.index`/`Array.index` (the latter + gated to `dtype == "integer"` by a validator, and never valid on `String`), and a direct + mechanical migration (`index = numeric_index` for every `Integer`/`Array(dtype="integer")` + field) in `migrate_to_v2_0_0_dev2.py`. This is a superset of the 44-field gap: it applies + unconditionally alongside any existing `pk`/`fk`, not just where those are absent, and + fixes the confirmed `gwf-lak.iconn` regression directly (`index=True` now set on that + field). `schema.json`/`dfnspec.md` updated; full `autotest/dfns/` snapshot suite + regenerated (306 files, additive-only diff). Phase 2 (`node` attribute, replacing the + `fk="node"` sentinel) and Phase 3 (`pk`/`fk` backfill: items (b)/(d)/(e)/(f) below) remain, + tracked in `index-node-attributes-plan.md` rather than here. - [x] **Bare (valueless) boolean attribute lines in v1 DFNs migrated as `False` instead of `True`.** v1 syntax allows a boolean attribute's line to carry no value at all (e.g. a @@ -132,10 +144,13 @@ - [ ] **(e) `fk = "node"` grid-cell sentinel, unused.** `exg-*.cellidm1`/`cellidm2` (6 exchange types), `gwf-gnc.cellidm`/`cellidn` look like the schema's existing grid-cell sentinel case, already speced and validated in `schema.py`, never populated by the mapper. - - [ ] **(a) Array-typed fields can't take `pk`/`fk` at all.** `irch`, `ievt`, `icvert`, `ja`, + - [x] **(a) Array-typed fields can't take `pk`/`fk` at all.** `irch`, `ievt`, `icvert`, `ja`, `ic`, `cellidsj` are `Array`s; `dfnspec.md` restricts `pk`/`fk` to integer/string columns in a list item record. v1's `numeric_index` on these likely just means "apply 1-based conversion," a concept with no home in v2 outside the relational `pk`/`fk` vocabulary. + Resolved: `numeric_index` never meant relational identity here, so it doesn't need + `pk`/`fk` — it needed `Array.index` (Phase 1, `index-node-attributes-plan.md`), now + migrated directly for every `Array(dtype="integer")` field. - [ ] **(f) Compound keys — no concept for them.** SFR's `diversions.iconr`/`idv` are unique only per-reach, not table-wide; a blind `pk=true` would misrepresent them. `pk`/`fk` as specced has no compound-key notion. From 521e0ed15d6bbdd3e071ebc42b45af5279253346 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Aug 2026 13:59:26 -0400 Subject: [PATCH 06/11] feat(dfns): add node attribute, drop fk="node" sentinel (Phase 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Splits the grid-cell-reference concern out of pk/fk entirely, per index-node-attributes-plan.md Phase 2. Adds Integer.node to schema.py (documentation-level placement convention, same as pk/fk — no schema validator, mirroring how pk/fk placement is already unenforced); removes _validate_fk_fields's fk == "node" exemption so it's a single hierarchical-path-vs-fk_ref invariant check — an unqualified fk="node" is no longer special-cased and must resolve to a real list block like any other bare fk value, which structurally deprecates it without a hard reject. Updates dfnspec.md (node documented under Integer, "Primary and foreign keys" grid-cell-sentinel form replaced with a pointer to node) and regenerates schema.json. Backfills the 6 known corpus candidates (5 exchange components' exchangedata.cellidm1/cellidm2, gwf-gnc's gncdata.cellidm/cellidn) via a new _mark_node_refs pass in migrate_to_v2_0_0_dev2.py, keyed on an explicit _NODE_REF_FIELDS allowlist — audited per field rather than derived, since v1 has no attribute this maps from mechanically. test_schema_relations.py's node-sentinel-specific rejection test replaced with one confirming the new (unremarkable) behavior. Full autotest/dfns/ suite green; snapshots regenerated, additive-only. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01DTmmUhFmfsjihggQUcZ3Ja --- .../__snapshots__/v2.0.0.dev2/exg-chfgwf.json | 6 ++- .../__snapshots__/v2.0.0.dev2/exg-chfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev2/exg-chfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwegwe.json | 6 ++- .../__snapshots__/v2.0.0.dev2/exg-gwegwe.toml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwegwe.yaml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwfgwf.json | 6 ++- .../__snapshots__/v2.0.0.dev2/exg-gwfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwtgwt.json | 6 ++- .../__snapshots__/v2.0.0.dev2/exg-gwtgwt.toml | 2 + .../__snapshots__/v2.0.0.dev2/exg-gwtgwt.yaml | 2 + .../__snapshots__/v2.0.0.dev2/exg-olfgwf.json | 6 ++- .../__snapshots__/v2.0.0.dev2/exg-olfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev2/exg-olfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwf-gnc.json | 6 ++- .../__snapshots__/v2.0.0.dev2/gwf-gnc.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwf-gnc.yaml | 2 + .../__snapshots__/v2.0.0.dev3/exg-chfgwf.json | 6 ++- .../__snapshots__/v2.0.0.dev3/exg-chfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev3/exg-chfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwegwe.json | 6 ++- .../__snapshots__/v2.0.0.dev3/exg-gwegwe.toml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwegwe.yaml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwfgwf.json | 6 ++- .../__snapshots__/v2.0.0.dev3/exg-gwfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwtgwt.json | 6 ++- .../__snapshots__/v2.0.0.dev3/exg-gwtgwt.toml | 2 + .../__snapshots__/v2.0.0.dev3/exg-gwtgwt.yaml | 2 + .../__snapshots__/v2.0.0.dev3/exg-olfgwf.json | 6 ++- .../__snapshots__/v2.0.0.dev3/exg-olfgwf.toml | 2 + .../__snapshots__/v2.0.0.dev3/exg-olfgwf.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwf-gnc.json | 6 ++- .../__snapshots__/v2.0.0.dev3/gwf-gnc.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwf-gnc.yaml | 2 + autotest/dfns/test_schema_relations.py | 10 ++-- docs/md/dfnspec.md | 16 +++--- index-node-attributes-plan.md | 18 ++++++- .../dfns/migrate_to_v2_0_0_dev2.py | 50 +++++++++++++++++++ modflow_devtools/dfns/schema.json | 5 ++ modflow_devtools/dfns/schema.py | 17 ++++--- todo.md | 16 ++++-- 43 files changed, 207 insertions(+), 45 deletions(-) diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.json index b5889f1f..aa2de63b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.json @@ -74,14 +74,16 @@ "longname": "cellid of cell in surface water model", "description": "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm2": { "type": "integer", "longname": "cellid of cell in groundwater model", "description": "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "bedleak": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.toml index 050d25a5..7bbbd7c5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.toml @@ -64,6 +64,7 @@ longname = "cellid of cell in surface water model" description = "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" @@ -71,6 +72,7 @@ longname = "cellid of cell in groundwater model" description = "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.bedleak] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.yaml index 3a6e6974..64763265 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-chfgwf.yaml @@ -70,6 +70,7 @@ blocks: (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false index: true + node: true cellidm2: type: integer longname: cellid of cell in groundwater model @@ -80,6 +81,7 @@ blocks: (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false index: true + node: true bedleak: type: double longname: bed leakance diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.json index ea2ff9ab..4bcc064d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.json @@ -147,14 +147,16 @@ "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.toml index bb2929f0..e0ed0c6b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.toml @@ -135,6 +135,7 @@ longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" @@ -142,6 +143,7 @@ longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.yaml index 3c6bd6aa..569c8529 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwegwe.yaml @@ -149,6 +149,7 @@ blocks: (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false index: true + node: true cellidm2: type: integer longname: cellid of second cell @@ -159,6 +160,7 @@ blocks: (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false index: true + node: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.json index 6d380cd1..b5a9b990 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.json @@ -174,14 +174,16 @@ "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.toml index 5e8f9fc4..e200e1b2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.toml @@ -158,6 +158,7 @@ longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" @@ -165,6 +166,7 @@ longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.yaml index c32d8a5d..6a0700c3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwfgwf.yaml @@ -194,6 +194,7 @@ blocks: (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false index: true + node: true cellidm2: type: integer longname: cellid of second cell @@ -204,6 +205,7 @@ blocks: (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false index: true + node: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.json index 8510d38d..005db502 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.json @@ -147,14 +147,16 @@ "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.toml index 5ff99e4e..f8e668ac 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.toml @@ -135,6 +135,7 @@ longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" @@ -142,6 +143,7 @@ longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.yaml index b86c7f4d..5cb12c75 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-gwtgwt.yaml @@ -147,6 +147,7 @@ blocks: (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false index: true + node: true cellidm2: type: integer longname: cellid of second cell @@ -157,6 +158,7 @@ blocks: (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false index: true + node: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.json index 502d2bce..489bb4c6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.json @@ -74,14 +74,16 @@ "longname": "cellid of cell in surface water model", "description": "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm2": { "type": "integer", "longname": "cellid of cell in groundwater model", "description": "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "bedleak": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.toml index 61e0cb68..f2ce0fdf 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.toml @@ -64,6 +64,7 @@ longname = "cellid of cell in surface water model" description = "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" @@ -71,6 +72,7 @@ longname = "cellid of cell in groundwater model" description = "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.bedleak] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.yaml index 470fa58e..5c383f04 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/exg-olfgwf.yaml @@ -70,6 +70,7 @@ blocks: (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false index: true + node: true cellidm2: type: integer longname: cellid of cell in groundwater model @@ -80,6 +81,7 @@ blocks: (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false index: true + node: true bedleak: type: double longname: bed leakance diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.json index 43552570..b3687690 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.json @@ -62,14 +62,16 @@ "longname": "GNC cellid n", "description": "is the cellid of the cell, $n$, in which the ghost node is located. For a structured grid that uses the DIS input file, CELLIDN is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDN is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDN is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm": { "type": "integer", "longname": "GNC cellid n", "description": "is the cellid of the connecting cell, $m$, to which flow occurs from the ghost node. For a structured grid that uses the DIS input file, CELLIDM is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidsj": { "type": "array", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.toml index da73c9a8..a4923d82 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.toml @@ -54,6 +54,7 @@ longname = "GNC cellid n" description = "is the cellid of the cell, $n$, in which the ghost node is located. For a structured grid that uses the DIS input file, CELLIDN is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDN is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDN is the node number for the cell." tagged = false index = true +node = true [blocks.gncdata.fields.gncdata.item.fields.cellidm] type = "integer" @@ -61,6 +62,7 @@ longname = "GNC cellid n" description = "is the cellid of the connecting cell, $m$, to which flow occurs from the ghost node. For a structured grid that uses the DIS input file, CELLIDM is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM is the node number for the cell." tagged = false index = true +node = true [blocks.gncdata.fields.gncdata.item.fields.cellidsj] type = "array" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.yaml index 43e1b016..aaee6b77 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-gnc.yaml @@ -64,6 +64,7 @@ blocks: file, then CELLIDN is the node number for the cell. tagged: false index: true + node: true cellidm: type: integer longname: GNC cellid n @@ -74,6 +75,7 @@ blocks: discretization (DISU) input file, then CELLIDM is the node number for the cell. tagged: false index: true + node: true cellidsj: type: array longname: GNC contributing cells diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.json index 2da96fa8..b1791313 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.json @@ -74,14 +74,16 @@ "longname": "cellid of cell in surface water model", "description": "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm2": { "type": "integer", "longname": "cellid of cell in groundwater model", "description": "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "bedleak": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.toml index 1e3f3baa..81421dd1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.toml @@ -64,6 +64,7 @@ longname = "cellid of cell in surface water model" description = "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" @@ -71,6 +72,7 @@ longname = "cellid of cell in groundwater model" description = "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.bedleak] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.yaml index 14666271..6e5962f6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-chfgwf.yaml @@ -70,6 +70,7 @@ blocks: (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false index: true + node: true cellidm2: type: integer longname: cellid of cell in groundwater model @@ -80,6 +81,7 @@ blocks: (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false index: true + node: true bedleak: type: double longname: bed leakance diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.json index d0771922..ce647472 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.json @@ -150,14 +150,16 @@ "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.toml index e0ba501f..5bc23804 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.toml @@ -138,6 +138,7 @@ longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" @@ -145,6 +146,7 @@ longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.yaml index 70c71fb7..8093d576 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwegwe.yaml @@ -151,6 +151,7 @@ blocks: (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false index: true + node: true cellidm2: type: integer longname: cellid of second cell @@ -161,6 +162,7 @@ blocks: (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false index: true + node: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.json index 4297ce4e..97a0b56d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.json @@ -177,14 +177,16 @@ "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.toml index a06fcf0c..d9824871 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.toml @@ -161,6 +161,7 @@ longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" @@ -168,6 +169,7 @@ longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.yaml index 9195e738..e0027d62 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwfgwf.yaml @@ -196,6 +196,7 @@ blocks: (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false index: true + node: true cellidm2: type: integer longname: cellid of second cell @@ -206,6 +207,7 @@ blocks: (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false index: true + node: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.json index 8ea74436..1db10058 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.json @@ -150,14 +150,16 @@ "longname": "cellid of first cell", "description": "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm2": { "type": "integer", "longname": "cellid of second cell", "description": "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "ihc": { "type": "integer", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.toml index f797f855..fda9d90f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.toml @@ -138,6 +138,7 @@ longname = "cellid of first cell" description = "is the cellid of the cell in model 1 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" @@ -145,6 +146,7 @@ longname = "cellid of second cell" description = "is the cellid of the cell in model 2 as specified in the simulation name file. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.ihc] type = "integer" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.yaml index ad972507..4ea0952b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-gwtgwt.yaml @@ -149,6 +149,7 @@ blocks: (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false index: true + node: true cellidm2: type: integer longname: cellid of second cell @@ -159,6 +160,7 @@ blocks: (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false index: true + node: true ihc: type: integer longname: integer flag for connection type diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.json index 606ff54c..e41a3455 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.json @@ -74,14 +74,16 @@ "longname": "cellid of cell in surface water model", "description": "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm2": { "type": "integer", "longname": "cellid of cell in groundwater model", "description": "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "bedleak": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.toml index aa016c22..b2abfa2b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.toml @@ -64,6 +64,7 @@ longname = "cellid of cell in surface water model" description = "is the cellid of the cell in model 1, which must be the surface water model. For a structured grid that uses the DIS input file, CELLIDM1 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM1 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM1 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.cellidm2] type = "integer" @@ -71,6 +72,7 @@ longname = "cellid of cell in groundwater model" description = "is the cellid of the cell in model 2, which must be the groundwater model. For a structured grid that uses the DIS input file, CELLIDM2 is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM2 is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM2 is the node number for the cell." tagged = false index = true +node = true [blocks.exchangedata.fields.exchangedata.item.fields.bedleak] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.yaml index d5c7a069..2390253a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/exg-olfgwf.yaml @@ -70,6 +70,7 @@ blocks: (DISU) input file, then CELLIDM1 is the node number for the cell. tagged: false index: true + node: true cellidm2: type: integer longname: cellid of cell in groundwater model @@ -80,6 +81,7 @@ blocks: (DISU) input file, then CELLIDM2 is the node number for the cell. tagged: false index: true + node: true bedleak: type: double longname: bed leakance diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.json index 3f63771b..baebee2c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.json @@ -62,14 +62,16 @@ "longname": "GNC cellid n", "description": "is the cellid of the cell, $n$, in which the ghost node is located. For a structured grid that uses the DIS input file, CELLIDN is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDN is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDN is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidm": { "type": "integer", "longname": "GNC cellid n", "description": "is the cellid of the connecting cell, $m$, to which flow occurs from the ghost node. For a structured grid that uses the DIS input file, CELLIDM is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM is the node number for the cell.", "tagged": false, - "index": true + "index": true, + "node": true }, "cellidsj": { "type": "array", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.toml index 5dacd98e..c39f9ba5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.toml @@ -54,6 +54,7 @@ longname = "GNC cellid n" description = "is the cellid of the cell, $n$, in which the ghost node is located. For a structured grid that uses the DIS input file, CELLIDN is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDN is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDN is the node number for the cell." tagged = false index = true +node = true [blocks.gncdata.fields.gncdata.item.fields.cellidm] type = "integer" @@ -61,6 +62,7 @@ longname = "GNC cellid n" description = "is the cellid of the connecting cell, $m$, to which flow occurs from the ghost node. For a structured grid that uses the DIS input file, CELLIDM is the layer, row, and column numbers of the cell. For a grid that uses the DISV input file, CELLIDM is the layer number and CELL2D number for the two cells. If the model uses the unstructured discretization (DISU) input file, then CELLIDM is the node number for the cell." tagged = false index = true +node = true [blocks.gncdata.fields.gncdata.item.fields.cellidsj] type = "array" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.yaml index 5e5df3c9..75674869 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-gnc.yaml @@ -64,6 +64,7 @@ blocks: file, then CELLIDN is the node number for the cell. tagged: false index: true + node: true cellidm: type: integer longname: GNC cellid n @@ -74,6 +75,7 @@ blocks: discretization (DISU) input file, then CELLIDM is the node number for the cell. tagged: false index: true + node: true cellidsj: type: array longname: GNC contributing cells diff --git a/autotest/dfns/test_schema_relations.py b/autotest/dfns/test_schema_relations.py index 23df762e..b8dc291a 100644 --- a/autotest/dfns/test_schema_relations.py +++ b/autotest/dfns/test_schema_relations.py @@ -97,10 +97,14 @@ def test_dfns_validate_fk_fields_fk_ref_with_hierarchical_fk_rejected(): Dfns(components={"gwf-nam": gwf, "gwf-mvr": mvr}) -def test_dfns_validate_fk_fields_fk_ref_with_node_rejected(): +def test_dfns_validate_fk_fields_fk_ref_with_node_not_special_cased(): + # "node" was formerly a reserved fk sentinel for grid-cell references (now + # replaced by the dedicated `Integer.node` attribute); as a bare fk value + # it's just an ordinary (if oddly named) block name like any other, so + # combining it with fk_ref is unremarkable and must not raise. mvr, gwf = _mvr_id_ctx(fk_val="node") - with pytest.raises(ValueError, match="may not be combined with fk_ref"): - Dfns(components={"gwf-nam": gwf, "gwf-mvr": mvr}) + spec = Dfns(components={"gwf-nam": gwf, "gwf-mvr": mvr}) + assert "gwf-mvr" in spec.components def test_dfns_validate_fk_fields_no_fk_set(): diff --git a/docs/md/dfnspec.md b/docs/md/dfnspec.md index f41155bf..f73cc5f3 100644 --- a/docs/md/dfnspec.md +++ b/docs/md/dfnspec.md @@ -57,6 +57,7 @@ This document describes the MODFLOW 6 component definition (DFN) system. This sy - [`pk`](#pk-1) - [`fk`](#fk-1) - [`fk_ref`](#fk_ref-1) + - [`node`](#node) - [Double](#double) - [Type-specific attributes](#type-specific-attributes-4) - [`time_series`](#time_series-2) @@ -356,7 +357,7 @@ Type `string`. ###### `fk` -`string | null (default: null)`. Marks this scalar as a foreign key. Valid only on integer or string scalars that are columns in a list item record. Three forms: (1) hierarchical path `"block.field"` or `"component.block.field"` — fully static, used without `fk_ref`; (2) sentinel `"node"` — grid cell reference, used without `fk_ref`; (3) bare block name (e.g., `"packagedata"`) — used together with `fk_ref` to name the block within the runtime-resolved target component, leaving only the pk field to be discovered. See "Primary/foreign keys". +`string | null (default: null)`. Marks this scalar as a foreign key. Valid only on integer or string scalars that are columns in a list item record. Two forms: (1) hierarchical path `"block.field"` or `"component.block.field"` — fully static, used without `fk_ref`; (2) bare block name (e.g., `"packagedata"`) — used together with `fk_ref` to name the block within the runtime-resolved target component, leaving only the pk field to be discovered. See "Primary/foreign keys". ###### `fk_ref` @@ -386,12 +387,16 @@ Type `integer`. ###### `fk` -`string | null (default: null)`. Marks this scalar as a foreign key. Valid only on integer or string scalars that are columns in a list item record. Three forms: (1) hierarchical path `"block.field"` or `"component.block.field"` — fully static, used without `fk_ref`; (2) sentinel `"node"` — grid cell reference, used without `fk_ref`; (3) bare block name (e.g., `"packagedata"`) — used together with `fk_ref` to name the block within the runtime-resolved target component, leaving only the pk field to be discovered. See "Primary/foreign keys". +`string | null (default: null)`. Marks this scalar as a foreign key. Valid only on integer or string scalars that are columns in a list item record. Two forms: (1) hierarchical path `"block.field"` or `"component.block.field"` — fully static, used without `fk_ref`; (2) bare block name (e.g., `"packagedata"`) — used together with `fk_ref` to name the block within the runtime-resolved target component, leaving only the pk field to be discovered. See "Primary/foreign keys". ###### `fk_ref` `string | null (default: null)`. For FKs whose target component is only known at runtime. Names a sibling string field whose value identifies the target component. May be set alone (block within target also unknown) or together with `fk` as a bare block name (block known, component not). See "Primary/foreign keys". +###### `node` + +`boolean (default: false)`. Marks this scalar as a grid cell reference, resolved from the parent model's grid (DIS/DISV/DISU) at runtime. Valid only on integer scalars that are columns in a list item record — the same placement `fk` requires. A structurally distinct resolution path from `fk`: a grid-cell lookup against model geometry, not a `pk` lookup in another list. + #### Double Type `double`. @@ -641,15 +646,14 @@ Examples: ### Primary and foreign keys -Sometimes a column in one list identifies a row in another list, or a grid cell. This can be conceptualized as a primary key (PK) / foreign key (FK) relation. Integers and strings may encode PK/FK semantics with attributes `pk`, `fk`, and `fk_ref`. +Sometimes a column in one list identifies a row in another list. This can be conceptualized as a primary key (PK) / foreign key (FK) relation. Integers and strings may encode PK/FK semantics with attributes `pk`, `fk`, and `fk_ref`. A column referencing a grid cell instead of another list's row is a distinct concern, handled by the `node` attribute (see [Integer](#integer)) rather than `pk`/`fk` — grid cells are resolved from the parent model's grid (DIS/DISV/DISU) at runtime, not looked up via a `pk` column. **Note**: PK/FK attributes are only valid on integer and string fields appearing as columns in a tabular (i.e. regular) list's record item type. -The `fk` attribute can take one of three forms: +The `fk` attribute can take one of two forms: - **Hierarchical path**: A path of the form `"[component.]block.field"`, for use when the primary key field is statically known. The `component` segment is necessary for cross-component references; it may be omitted for within-component references. The hierarchical path form may not be used with `fk_ref`. -- **Grid cell sentinel**: A value `"node"` indicates a grid cell reference, resolve from the parent model's grid at runtime. This form may not be used with `fk_ref`. -- **Bare block name**: The name of a block in which there is exactly one `pk` field. In this case, `fk_ref` is required to resolve the target component at runtime. Note that blocks must not be named "node" to avoid interference with the grid cell sentinel. +- **Bare block name**: The name of a block in which there is exactly one `pk` field. In this case, `fk_ref` is required to resolve the target component at runtime. The `fk_ref` attribute names a string field whose runtime value identifies the component containing the `pk` field. Two sub-cases exist: diff --git a/index-node-attributes-plan.md b/index-node-attributes-plan.md index aba48ac8..1dcf63cf 100644 --- a/index-node-attributes-plan.md +++ b/index-node-attributes-plan.md @@ -122,7 +122,21 @@ Corpus-identified remaining items, from the earlier scan, each independently sch from `todo.md`. Full `autotest/dfns/` suite green; snapshots regenerated (306 files, additive-only diff — every change is a bare `"index": true`/`index = true` addition, no removals beyond JSON trailing-comma churn). -- **Phase 2 (now, small)**: `node` — schema + validator + `fk="node"` removal + the handful of - exchange/GNC backfills. Well-scoped enough to go in the same pass as Phase 1. +- **Phase 2 (done, 2026-08-20)**: `node` — schema + validator + `fk="node"` removal + the + handful of exchange/GNC backfills. Well-scoped enough to go in the same pass as Phase 1. + Landed: `Integer.node` in `schema.py` (no placement validator — same as `pk`/`fk`, this is + a documentation-level convention, not schema-enforced); `_validate_fk_fields`'s `fk == "node"` + exemption removed, now a single hierarchical-path-vs-fk_ref invariant check (an unqualified + `fk = "node"` is no longer special — it must resolve to an actual list block like any other + bare fk value, which in practice means nobody will set it, achieving the deprecation without + a hard reject); `dfnspec.md` updated (`node` documented under Integer, "Primary and foreign + keys" section's grid-cell-sentinel form replaced with a pointer to `node`); `schema.json` + regenerated; a new `_mark_node_refs` pass in `migrate_to_v2_0_0_dev2.py` backfills the 6 + corpus candidates by an explicit per-component allowlist (`_NODE_REF_FIELDS`) — the 5 + exchange types' `exchangedata.cellidm1`/`cellidm2` and `gwf-gnc.gncdata.cellidm`/`cellidn` — + since (unlike `index`) v1 has no attribute this can be migrated from mechanically. + `autotest/dfns/test_schema_relations.py`'s node-sentinel-specific test was replaced with one + asserting the new (unremarkable) behavior. Full `autotest/dfns/` suite green; snapshots + regenerated (36 files, additive-only — 6 components x 2 fields x 2 dev dirs x 3 formats). - **Phase 3 (later, incremental, no urgency)**: `pk`/`fk` extensions — lonely-pk allowlist, cross-component `idcxs`, SFR `diversions` split. diff --git a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py index 32f222a6..8ef1a066 100644 --- a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py +++ b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py @@ -432,6 +432,55 @@ def _mark_lonely_pk(blocks: dict[str, v2.Block]) -> dict[str, v2.Block]: return {**blocks, **updated} +# Corpus candidates for the `node` attribute (see index-node-attributes-plan.md +# Phase 2): Integer columns in a list item record that reference a grid cell, +# resolved from the parent model's grid (DIS/DISV/DISU) at runtime, rather than +# a pk/fk relation to another list's row. Unlike `index`, v1 has no attribute +# that signals this (numeric_index only says "needs 1-based/0-based +# conversion" — true here too, and already migrated separately — not "is a +# grid-cell reference"), so these are backfilled by an explicit, audited +# per-field allowlist rather than derived mechanically. In every entry here the +# list field's own name matches its enclosing block's name. +_NODE_REF_FIELDS: dict[str, tuple[str, tuple[str, ...]]] = { + "exg-chfgwf": ("exchangedata", ("cellidm1", "cellidm2")), + "exg-gwegwe": ("exchangedata", ("cellidm1", "cellidm2")), + "exg-gwfgwf": ("exchangedata", ("cellidm1", "cellidm2")), + "exg-gwtgwt": ("exchangedata", ("cellidm1", "cellidm2")), + "exg-olfgwf": ("exchangedata", ("cellidm1", "cellidm2")), + "gwf-gnc": ("gncdata", ("cellidm", "cellidn")), +} + + +def _mark_node_refs(name: str, blocks: dict[str, v2.Block]) -> dict[str, v2.Block]: + """Mark this component's known grid-cell-reference columns `node=True`. + + See `_NODE_REF_FIELDS` for why this is an explicit allowlist rather than a + derived/mechanical pass. + """ + entry = _NODE_REF_FIELDS.get(name) + if entry is None: + return blocks + block_name, field_names = entry + block = blocks.get(block_name) + if block is None: + return blocks + list_field = block.fields.get(block_name) + if not isinstance(list_field, v2.List) or not isinstance(list_field.item, v2.Record): + return blocks + item = list_field.item + updates = { + fname: f.model_copy(update={"node": True}) + for fname in field_names + if isinstance(f := item.fields.get(fname), v2.Integer) and not f.node + } + if not updates: + return blocks + new_item = item.model_copy(update={"fields": {**item.fields, **updates}}) + new_list = list_field.model_copy(update={"item": new_item}) + new_block = block.model_copy(update={"fields": {**block.fields, block_name: new_list}}) + return {**blocks, block_name: new_block} + + def _fill_period_list_shapes( blocks: dict[str, v2.Block], explicit_dims: dict[str, v2.Dim], @@ -1456,6 +1505,7 @@ def _lookup(rname: str) -> dict | None: # the original field). No other pass between the old and new call sites # reads or depends on `pk`/`fk` state. blocks = _mark_lonely_pk(blocks) + blocks = _mark_node_refs(name, blocks) dims = {**explicit_dims, **array_dims, **derived_dims} or None d: dict[str, Any] = { diff --git a/modflow_devtools/dfns/schema.json b/modflow_devtools/dfns/schema.json index b005f010..99b43d74 100644 --- a/modflow_devtools/dfns/schema.json +++ b/modflow_devtools/dfns/schema.json @@ -653,6 +653,11 @@ ], "default": null, "title": "Fk Ref" + }, + "node": { + "default": false, + "title": "Node", + "type": "boolean" } }, "required": [ diff --git a/modflow_devtools/dfns/schema.py b/modflow_devtools/dfns/schema.py index c75737fc..495a735c 100644 --- a/modflow_devtools/dfns/schema.py +++ b/modflow_devtools/dfns/schema.py @@ -100,6 +100,10 @@ class Integer(FieldBase): pk: bool = False fk: str | None = None fk_ref: str | None = None + # Grid-cell reference, resolved from the parent model's grid (DIS/DISV/DISU) + # at runtime — a structurally different resolution path than fk (geometry + # lookup, not a pk lookup in another list). See docs/md/dfnspec.md. + node: bool = False class Double(FieldBase): @@ -946,21 +950,20 @@ def _validate_fk_fields(component: "ComponentBase", spec: "Dfns") -> None: """ For every Integer/String field with fk or fk_ref set, validate structure. - Three forms (see docs/md/dfnspec.md, "Primary and foreign keys"): + Two forms (see docs/md/dfnspec.md, "Primary and foreign keys"); grid-cell + references are a separate mechanism entirely (the `node` attribute, not an + `fk` value — see `Integer.node`): - Hierarchical path fk ("[component.]block.field", no fk_ref): the named block must be a list block (in this component, or cross-component if qualified) whose item has a pk field. - - "node" sentinel fk (no fk_ref): a grid cell reference, resolved from the - parent model's grid at runtime — no further structural check is - possible here. - Bare block name fk + fk_ref, or fk_ref alone: fk_ref must name a sibling String field in the same record, whose runtime value identifies the target component (and, with fk, the pk field is looked up in the block named by fk within that component). The target itself is only known at runtime, so no further structural check is possible statically. - A hierarchical-path or "node" fk may not be combined with fk_ref. + A hierarchical-path fk may not be combined with fk_ref. """ if not component.blocks: return @@ -971,7 +974,7 @@ def _check_fields(fields: dict) -> None: fk_ref: str | None = getattr(field, "fk_ref", None) if fk_ref is not None: - if fk is not None and (fk == "node" or "." in fk): + if fk is not None and "." in fk: raise ValueError( f"Field {field.name!r}: fk={fk!r} may not be combined with " f"fk_ref (only a bare block name may be)" @@ -985,7 +988,7 @@ def _check_fields(fields: dict) -> None: # fk (a bare block name, if set) and the component it lives in # are both resolved from fk_ref's runtime value — no further # static check is possible. - elif fk is not None and fk != "node": + elif fk is not None: block_name = fk.split(".")[0] if "." in fk else fk list_field = _find_list_in_block(component, block_name) if list_field is None: diff --git a/todo.md b/todo.md index e05bcd9e..8f3716bc 100644 --- a/todo.md +++ b/todo.md @@ -94,8 +94,8 @@ fixes the confirmed `gwf-lak.iconn` regression directly (`index=True` now set on that field). `schema.json`/`dfnspec.md` updated; full `autotest/dfns/` snapshot suite regenerated (306 files, additive-only diff). Phase 2 (`node` attribute, replacing the - `fk="node"` sentinel) and Phase 3 (`pk`/`fk` backfill: items (b)/(d)/(e)/(f) below) remain, - tracked in `index-node-attributes-plan.md` rather than here. + `fk="node"` sentinel) also done — see (e) below. Phase 3 (`pk`/`fk` backfill: items + (b)/(d)/(f) below) remains, tracked in `index-node-attributes-plan.md` rather than here. - [x] **Bare (valueless) boolean attribute lines in v1 DFNs migrated as `False` instead of `True`.** v1 syntax allows a boolean attribute's line to carry no value at all (e.g. a @@ -141,9 +141,19 @@ `chf-zdg`, `olf-dfw`, `olf-zdg`, `swf-dfw`, `swf-zdg`) never gets `fk` set, because `_resolve_relations` only ever sees one component's own `blocks` dict. Schema already supports this (`fk = "[component.]block.field"`); migration mapper never attempts it. - - [ ] **(e) `fk = "node"` grid-cell sentinel, unused.** `exg-*.cellidm1`/`cellidm2` (6 + - [x] **(e) `fk = "node"` grid-cell sentinel, unused.** `exg-*.cellidm1`/`cellidm2` (6 exchange types), `gwf-gnc.cellidm`/`cellidn` look like the schema's existing grid-cell sentinel case, already speced and validated in `schema.py`, never populated by the mapper. + Resolved by replacing the sentinel entirely with a dedicated `Integer.node` attribute + (Phase 2, `index-node-attributes-plan.md`): confirmed the actual corpus count is 5 + exchange components (`exg-chfgwf`/`exg-gwegwe`/`exg-gwfgwf`/`exg-gwtgwt`/`exg-olfgwf`, each + with `exchangedata.cellidm1`/`cellidm2`) plus `gwf-gnc.gncdata.cellidm`/`cellidn` — 6 fields + total across those, not "6 exchange types" as the original note implied. Backfilled by a + new `_mark_node_refs` pass keyed on an explicit `_NODE_REF_FIELDS` allowlist (audited, not + derived — v1 has no attribute this maps from). `fk = "node"` itself is no longer a special + sentinel: `_validate_fk_fields` dropped its exemption, so an unqualified `fk = "node"` now + just has to resolve to an actual list block like any other bare fk value (in practice + meaning nobody sets it — the deprecation is structural, not a hard reject). - [x] **(a) Array-typed fields can't take `pk`/`fk` at all.** `irch`, `ievt`, `icvert`, `ja`, `ic`, `cellidsj` are `Array`s; `dfnspec.md` restricts `pk`/`fk` to integer/string columns in a list item record. v1's `numeric_index` on these likely just means "apply 1-based From 447fb5e2adbec12f1775a576ea19035fae77b529 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Aug 2026 14:09:16 -0400 Subject: [PATCH 07/11] fix(dfns): pk/fk backfill for lonely rows, self/cross refs (Phase 3) Completes the pk/fk backfill items from index-node-attributes-plan.md Phase 3 (todo.md gap #2 sub-issues (b)/(d)/(f)), now that pk/fk no longer double as the serialization signal (index/node cover that). - _LONELY_PK_FIELDS widened to vertices/cell2d/cell1d: DISU/DISV/ DISV1D/DISV2D's leading iv/icell2d/icell1d columns are genuinely the same lonely-pk shape _mark_lonely_pk already detects (12 components). - New _apply_fk_backfill pass (mirrors Phase 2's _mark_node_refs) sets fk on three real single-column relations the general passes can't infer: SFR diversions.iconr -> packagedata.ifno (a real reference into reach numbers, confirmed from its description -- not a compound-scoped id like its sibling idv, which correctly keeps index only), UZF packagedata.ivertcon -> packagedata.ifno (a self-referential relation: a UZF cell may point to another UZF cell in the same list), and idcxs on chf-cdb/chf-zdg/olf-zdg/swf-zdg -> the matching *-cxs component's packagedata.idcxs (cross-component, which _resolve_relations is structurally single-component-scoped and can't reach). - Cross-component fk backfill surfaced a latent validator bug: _validate_fk_fields's fk.split(".")[0] only ever read the first dot-segment as the block name, so the documented 3-segment "component.block.field" form would have been misparsed and rejected -- nobody had hit it before because no fk had ever actually used that form. Fixed to resolve the target component via spec.components when 3 segments are present. Investigated and deliberately left alone (documented in todo.md/ index-node-attributes-plan.md rather than silently dropped): MAW's connectiondata.icon (same compound-scoped, no-real-target shape as gwf-lak.iconn -- index only is correct) and chf/olf/swf-dfw's idcxs (an Array, shape=["nodes"], which can't carry fk under the current schema at all). All five decomposed sub-issues from the original numeric_index -> pk/fk gap scan (a)-(g) are now resolved. Full autotest/dfns/ suite green; snapshots regenerated, additive-only. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01DTmmUhFmfsjihggQUcZ3Ja --- .../__snapshots__/v2.0.0.dev2/chf-cdb.json | 3 +- .../__snapshots__/v2.0.0.dev2/chf-cdb.toml | 1 + .../__snapshots__/v2.0.0.dev2/chf-cdb.yaml | 1 + .../__snapshots__/v2.0.0.dev2/chf-disv1d.json | 6 +- .../__snapshots__/v2.0.0.dev2/chf-disv1d.toml | 2 + .../__snapshots__/v2.0.0.dev2/chf-disv1d.yaml | 2 + .../__snapshots__/v2.0.0.dev2/chf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev2/chf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev2/chf-zdg.yaml | 1 + .../__snapshots__/v2.0.0.dev2/gwe-disu.json | 6 +- .../__snapshots__/v2.0.0.dev2/gwe-disu.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwe-disu.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwe-disv.json | 6 +- .../__snapshots__/v2.0.0.dev2/gwe-disv.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwe-disv.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwf-disu.json | 6 +- .../__snapshots__/v2.0.0.dev2/gwf-disu.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwf-disu.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwf-disv.json | 6 +- .../__snapshots__/v2.0.0.dev2/gwf-disv.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwf-disv.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwf-sfr.json | 3 +- .../__snapshots__/v2.0.0.dev2/gwf-sfr.toml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-sfr.yaml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-uzf.json | 3 +- .../__snapshots__/v2.0.0.dev2/gwf-uzf.toml | 1 + .../__snapshots__/v2.0.0.dev2/gwf-uzf.yaml | 1 + .../__snapshots__/v2.0.0.dev2/gwt-disu.json | 6 +- .../__snapshots__/v2.0.0.dev2/gwt-disu.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwt-disu.yaml | 2 + .../__snapshots__/v2.0.0.dev2/gwt-disv.json | 6 +- .../__snapshots__/v2.0.0.dev2/gwt-disv.toml | 2 + .../__snapshots__/v2.0.0.dev2/gwt-disv.yaml | 2 + .../__snapshots__/v2.0.0.dev2/olf-disv1d.json | 6 +- .../__snapshots__/v2.0.0.dev2/olf-disv1d.toml | 2 + .../__snapshots__/v2.0.0.dev2/olf-disv1d.yaml | 2 + .../__snapshots__/v2.0.0.dev2/olf-disv2d.json | 6 +- .../__snapshots__/v2.0.0.dev2/olf-disv2d.toml | 2 + .../__snapshots__/v2.0.0.dev2/olf-disv2d.yaml | 2 + .../__snapshots__/v2.0.0.dev2/olf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev2/olf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev2/olf-zdg.yaml | 1 + .../__snapshots__/v2.0.0.dev2/prt-disv.json | 6 +- .../__snapshots__/v2.0.0.dev2/prt-disv.toml | 2 + .../__snapshots__/v2.0.0.dev2/prt-disv.yaml | 2 + .../__snapshots__/v2.0.0.dev2/swf-disv1d.json | 6 +- .../__snapshots__/v2.0.0.dev2/swf-disv1d.toml | 2 + .../__snapshots__/v2.0.0.dev2/swf-disv1d.yaml | 2 + .../__snapshots__/v2.0.0.dev2/swf-disv2d.json | 6 +- .../__snapshots__/v2.0.0.dev2/swf-disv2d.toml | 2 + .../__snapshots__/v2.0.0.dev2/swf-disv2d.yaml | 2 + .../__snapshots__/v2.0.0.dev2/swf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev2/swf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev2/swf-zdg.yaml | 1 + .../__snapshots__/v2.0.0.dev3/chf-cdb.json | 3 +- .../__snapshots__/v2.0.0.dev3/chf-cdb.toml | 1 + .../__snapshots__/v2.0.0.dev3/chf-cdb.yaml | 1 + .../__snapshots__/v2.0.0.dev3/chf-disv1d.json | 6 +- .../__snapshots__/v2.0.0.dev3/chf-disv1d.toml | 2 + .../__snapshots__/v2.0.0.dev3/chf-disv1d.yaml | 2 + .../__snapshots__/v2.0.0.dev3/chf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev3/chf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev3/chf-zdg.yaml | 1 + .../__snapshots__/v2.0.0.dev3/gwe-disu.json | 6 +- .../__snapshots__/v2.0.0.dev3/gwe-disu.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwe-disu.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwe-disv.json | 6 +- .../__snapshots__/v2.0.0.dev3/gwe-disv.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwe-disv.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwf-disu.json | 6 +- .../__snapshots__/v2.0.0.dev3/gwf-disu.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwf-disu.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwf-disv.json | 6 +- .../__snapshots__/v2.0.0.dev3/gwf-disv.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwf-disv.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwf-sfr.json | 3 +- .../__snapshots__/v2.0.0.dev3/gwf-sfr.toml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-sfr.yaml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-uzf.json | 3 +- .../__snapshots__/v2.0.0.dev3/gwf-uzf.toml | 1 + .../__snapshots__/v2.0.0.dev3/gwf-uzf.yaml | 1 + .../__snapshots__/v2.0.0.dev3/gwt-disu.json | 6 +- .../__snapshots__/v2.0.0.dev3/gwt-disu.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwt-disu.yaml | 2 + .../__snapshots__/v2.0.0.dev3/gwt-disv.json | 6 +- .../__snapshots__/v2.0.0.dev3/gwt-disv.toml | 2 + .../__snapshots__/v2.0.0.dev3/gwt-disv.yaml | 2 + .../__snapshots__/v2.0.0.dev3/olf-disv1d.json | 6 +- .../__snapshots__/v2.0.0.dev3/olf-disv1d.toml | 2 + .../__snapshots__/v2.0.0.dev3/olf-disv1d.yaml | 2 + .../__snapshots__/v2.0.0.dev3/olf-disv2d.json | 6 +- .../__snapshots__/v2.0.0.dev3/olf-disv2d.toml | 2 + .../__snapshots__/v2.0.0.dev3/olf-disv2d.yaml | 2 + .../__snapshots__/v2.0.0.dev3/olf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev3/olf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev3/olf-zdg.yaml | 1 + .../__snapshots__/v2.0.0.dev3/prt-disv.json | 6 +- .../__snapshots__/v2.0.0.dev3/prt-disv.toml | 2 + .../__snapshots__/v2.0.0.dev3/prt-disv.yaml | 2 + .../__snapshots__/v2.0.0.dev3/swf-disv1d.json | 6 +- .../__snapshots__/v2.0.0.dev3/swf-disv1d.toml | 2 + .../__snapshots__/v2.0.0.dev3/swf-disv1d.yaml | 2 + .../__snapshots__/v2.0.0.dev3/swf-disv2d.json | 6 +- .../__snapshots__/v2.0.0.dev3/swf-disv2d.toml | 2 + .../__snapshots__/v2.0.0.dev3/swf-disv2d.yaml | 2 + .../__snapshots__/v2.0.0.dev3/swf-zdg.json | 3 +- .../__snapshots__/v2.0.0.dev3/swf-zdg.toml | 1 + .../__snapshots__/v2.0.0.dev3/swf-zdg.yaml | 1 + index-node-attributes-plan.md | 67 +++++++---- .../dfns/migrate_to_v2_0_0_dev2.py | 113 +++++++++++++++--- modflow_devtools/dfns/schema.py | 33 ++++- todo.md | 40 ++++++- 112 files changed, 448 insertions(+), 105 deletions(-) diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.json index 17dd4ccd..ae4d004a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.json @@ -98,7 +98,8 @@ "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", "tagged": false, - "index": true + "index": true, + "fk": "chf-cxs.packagedata.idcxs" }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.toml index 50cab52a..8a1948f3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.toml @@ -88,6 +88,7 @@ longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false index = true +fk = "chf-cxs.packagedata.idcxs" [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.yaml index e07b9eb9..e3de9ebb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-cdb.yaml @@ -101,6 +101,7 @@ blocks: wide channel. tagged: false index: true + fk: chf-cxs.packagedata.idcxs width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json index 200d46df..be3f8f16 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.json @@ -146,7 +146,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -181,7 +182,8 @@ "longname": "cell1d number", "description": "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "fdc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml index ddcebada..3124ae56 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.toml @@ -132,6 +132,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -161,6 +162,7 @@ longname = "cell1d number" description = "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell1d.fields.cell1d.item.fields.fdc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml index cbf29755..c21fb1ba 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-disv1d.yaml @@ -140,6 +140,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -167,6 +168,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true fdc: type: double longname: fractional distance to the cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.json index d225827e..bc1d11d0 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.json @@ -116,7 +116,8 @@ "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", "tagged": false, - "index": true + "index": true, + "fk": "chf-cxs.packagedata.idcxs" }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.toml index 26191bca..0ddc31ee 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.toml @@ -104,6 +104,7 @@ longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false index = true +fk = "chf-cxs.packagedata.idcxs" [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.yaml index 18e09418..3ff891c3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-zdg.yaml @@ -117,6 +117,7 @@ blocks: wide channel. tagged: false index: true + fk: chf-cxs.packagedata.idcxs width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.json index b23dfdd6..78e8d7e1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.json @@ -229,7 +229,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -264,7 +265,8 @@ "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.toml index e58df6e8..d3502205 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.toml @@ -211,6 +211,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -240,6 +241,7 @@ longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.yaml index 6214df8c..0131bbad 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disu.yaml @@ -247,6 +247,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -274,6 +275,7 @@ blocks: order from 1 to NODES. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.json index 48b8d024..a5516ccb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.json @@ -187,7 +187,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -222,7 +223,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.toml index 645d6575..da6349fd 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.toml @@ -171,6 +171,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -200,6 +201,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.yaml index d43be729..54a084cd 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-disv.yaml @@ -179,6 +179,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -206,6 +207,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.json index 48500013..23866203 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.json @@ -230,7 +230,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -266,7 +267,8 @@ "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.toml index efe24080..462a37f4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.toml @@ -212,6 +212,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -242,6 +243,7 @@ longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.yaml index 5a20f961..4d81225d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disu.yaml @@ -248,6 +248,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -276,6 +277,7 @@ blocks: order from 1 to NODES. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.json index 6432b091..8b3bc3d8 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.json @@ -187,7 +187,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -222,7 +223,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.toml index 0c016b4f..be6d7ae9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.toml @@ -171,6 +171,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -200,6 +201,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.yaml index 56d60dd2..c59048cb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-disv.yaml @@ -179,6 +179,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -206,6 +207,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.json index 232ed997..690d817c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.json @@ -438,7 +438,8 @@ "longname": "downstream reach number for diversion", "description": "integer value that defines the downstream reach that will receive the diverted water. IDV must be greater than zero and less than or equal to NREACHES. Furthermore, reach ICONR must be a downstream connection for reach IFNO.", "tagged": false, - "index": true + "index": true, + "fk": "packagedata.ifno" }, "cprior": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.toml index 073816be..a701ad34 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.toml @@ -397,6 +397,7 @@ longname = "downstream reach number for diversion" description = "integer value that defines the downstream reach that will receive the diverted water. IDV must be greater than zero and less than or equal to NREACHES. Furthermore, reach ICONR must be a downstream connection for reach IFNO." tagged = false index = true +fk = "packagedata.ifno" [blocks.diversions.fields.diversions.item.fields.cprior] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.yaml index ed607284..928f501a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-sfr.yaml @@ -462,6 +462,7 @@ blocks: reach ICONR must be a downstream connection for reach IFNO. tagged: false index: true + fk: packagedata.ifno cprior: type: string longname: iprior code diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.json index 8c869a59..e9d2aab3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.json @@ -269,7 +269,8 @@ "longname": "vertical connection flag", "description": "integer value set to specify underlying UZF cell that receives water flowing to bottom of cell. If unsaturated zone flow reaches the water table before the cell bottom, then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell.", "tagged": false, - "index": true + "index": true, + "fk": "packagedata.ifno" }, "surfdep": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.toml index 794b9abe..bbb74c0c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.toml @@ -249,6 +249,7 @@ longname = "vertical connection flag" description = "integer value set to specify underlying UZF cell that receives water flowing to bottom of cell. If unsaturated zone flow reaches the water table before the cell bottom, then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell." tagged = false index = true +fk = "packagedata.ifno" [blocks.packagedata.fields.packagedata.item.fields.surfdep] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.yaml index 779b71fb..162d19bb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-uzf.yaml @@ -270,6 +270,7 @@ blocks: of 0 indicates the UZF cell is not connected to an underlying UZF cell. tagged: false index: true + fk: packagedata.ifno surfdep: type: double longname: surface depression depth diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.json index 4a631786..d3c8ed37 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.json @@ -230,7 +230,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -266,7 +267,8 @@ "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.toml index d55b4f6a..3249a7e2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.toml @@ -212,6 +212,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -242,6 +243,7 @@ longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.yaml index dc064681..a339e0a1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disu.yaml @@ -248,6 +248,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -276,6 +277,7 @@ blocks: order from 1 to NODES. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.json index 419b6b8d..d0e552c6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.json @@ -187,7 +187,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -222,7 +223,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.toml index 6203384b..6a2b0da2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.toml @@ -171,6 +171,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -200,6 +201,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.yaml index f7f1285d..c2d04035 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-disv.yaml @@ -179,6 +179,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -206,6 +207,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json index 6721ee54..9eca4770 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.json @@ -156,7 +156,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -191,7 +192,8 @@ "longname": "cell2d number", "description": "is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "fdc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml index 4de40e8d..8c5abc49 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.toml @@ -142,6 +142,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -171,6 +172,7 @@ longname = "cell2d number" description = "is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.fdc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml index 33e4fceb..8a69baa2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv1d.yaml @@ -148,6 +148,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -175,6 +176,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true fdc: type: double longname: fractional distance to the cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.json index 50cdf417..a2b43209 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.json @@ -134,7 +134,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -169,7 +170,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.toml index 91612490..546c80d7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.toml @@ -120,6 +120,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -149,6 +150,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.yaml index 1f7e31e2..cb899954 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-disv2d.yaml @@ -131,6 +131,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -158,6 +159,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.json index 817ff124..55dc481c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.json @@ -116,7 +116,8 @@ "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", "tagged": false, - "index": true + "index": true, + "fk": "olf-cxs.packagedata.idcxs" }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.toml index 59c44c30..5e3780ab 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.toml @@ -104,6 +104,7 @@ longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false index = true +fk = "olf-cxs.packagedata.idcxs" [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.yaml index cc9db2b0..99e1f380 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-zdg.yaml @@ -117,6 +117,7 @@ blocks: wide channel. tagged: false index: true + fk: olf-cxs.packagedata.idcxs width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.json index eecd573a..a429f485 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.json @@ -184,7 +184,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -219,7 +220,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.toml index 19d47ee6..bed4b83e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.toml @@ -168,6 +168,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -197,6 +198,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.yaml index b7b8feb1..b62dbe9a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/prt-disv.yaml @@ -175,6 +175,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -202,6 +203,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json index 38d931ea..10dd3446 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.json @@ -146,7 +146,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -181,7 +182,8 @@ "longname": "cell1d number", "description": "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "fdc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml index 617133ec..e3aecc57 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.toml @@ -132,6 +132,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -161,6 +162,7 @@ longname = "cell1d number" description = "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell1d.fields.cell1d.item.fields.fdc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml index 7d7bb7bb..bee9abfe 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv1d.yaml @@ -140,6 +140,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -167,6 +168,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true fdc: type: double longname: fractional distance to the cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.json index 1008e13b..0351df0d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.json @@ -134,7 +134,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -169,7 +170,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.toml index c0ebe951..4f1ed4b6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.toml @@ -120,6 +120,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -149,6 +150,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.yaml index cbe69457..e0f7f85f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-disv2d.yaml @@ -131,6 +131,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -158,6 +159,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.json index a560c2ba..7d982e4e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.json @@ -116,7 +116,8 @@ "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", "tagged": false, - "index": true + "index": true, + "fk": "swf-cxs.packagedata.idcxs" }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.toml index 46547f93..e5822dec 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.toml @@ -104,6 +104,7 @@ longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false index = true +fk = "swf-cxs.packagedata.idcxs" [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.yaml index fbe69562..a121828c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-zdg.yaml @@ -118,6 +118,7 @@ blocks: wide channel. tagged: false index: true + fk: swf-cxs.packagedata.idcxs width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.json index 7ad3b777..ee41dbcf 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.json @@ -107,7 +107,8 @@ "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", "tagged": false, - "index": true + "index": true, + "fk": "chf-cxs.packagedata.idcxs" }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.toml index 52bd26c7..7983624f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.toml @@ -97,6 +97,7 @@ longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false index = true +fk = "chf-cxs.packagedata.idcxs" [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.yaml index 81db6294..d725ae79 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-cdb.yaml @@ -107,6 +107,7 @@ blocks: wide channel. tagged: false index: true + fk: chf-cxs.packagedata.idcxs width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json index 5810342e..89f687eb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.json @@ -146,7 +146,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -181,7 +182,8 @@ "longname": "cell1d number", "description": "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "fdc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml index c91cdb98..955ab44a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.toml @@ -132,6 +132,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -161,6 +162,7 @@ longname = "cell1d number" description = "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell1d.fields.cell1d.item.fields.fdc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml index d2f50ca3..5317b78a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-disv1d.yaml @@ -140,6 +140,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -167,6 +168,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true fdc: type: double longname: fractional distance to the cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.json index e0767e78..fab945af 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.json @@ -125,7 +125,8 @@ "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", "tagged": false, - "index": true + "index": true, + "fk": "chf-cxs.packagedata.idcxs" }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.toml index 304b2573..6b1e60ba 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.toml @@ -113,6 +113,7 @@ longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false index = true +fk = "chf-cxs.packagedata.idcxs" [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.yaml index 1ff4e55a..51eb2150 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-zdg.yaml @@ -123,6 +123,7 @@ blocks: wide channel. tagged: false index: true + fk: chf-cxs.packagedata.idcxs width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.json index c1b0db52..f3c6375d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.json @@ -232,7 +232,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -267,7 +268,8 @@ "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.toml index 85724b36..b522e1a7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.toml @@ -214,6 +214,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -243,6 +244,7 @@ longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.yaml index 1a43d294..5155c096 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disu.yaml @@ -249,6 +249,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -276,6 +277,7 @@ blocks: order from 1 to NODES. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.json index 8f6f8914..07d7ff4b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.json @@ -187,7 +187,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -222,7 +223,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.toml index 2fe544da..0d81cbd2 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.toml @@ -171,6 +171,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -200,6 +201,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.yaml index d3582468..aed6f089 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-disv.yaml @@ -179,6 +179,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -206,6 +207,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.json index 1a754d68..51366d45 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.json @@ -233,7 +233,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -269,7 +270,8 @@ "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.toml index 8d0858a3..cbf8e357 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.toml @@ -215,6 +215,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -245,6 +246,7 @@ longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.yaml index a6eb9dbc..243a1ce1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disu.yaml @@ -250,6 +250,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -278,6 +279,7 @@ blocks: order from 1 to NODES. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.json index 019314fb..be8607d5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.json @@ -187,7 +187,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -222,7 +223,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.toml index 0066b2e5..e2def104 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.toml @@ -171,6 +171,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -200,6 +201,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.yaml index cca8fbc9..76e29f07 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-disv.yaml @@ -179,6 +179,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -206,6 +207,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.json index 054ab190..a4e970ce 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.json @@ -441,7 +441,8 @@ "longname": "downstream reach number for diversion", "description": "integer value that defines the downstream reach that will receive the diverted water. IDV must be greater than zero and less than or equal to NREACHES. Furthermore, reach ICONR must be a downstream connection for reach IFNO.", "tagged": false, - "index": true + "index": true, + "fk": "packagedata.ifno" }, "cprior": { "type": "string", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.toml index af502092..71c4b242 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.toml @@ -400,6 +400,7 @@ longname = "downstream reach number for diversion" description = "integer value that defines the downstream reach that will receive the diverted water. IDV must be greater than zero and less than or equal to NREACHES. Furthermore, reach ICONR must be a downstream connection for reach IFNO." tagged = false index = true +fk = "packagedata.ifno" [blocks.diversions.fields.diversions.item.fields.cprior] type = "string" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.yaml index 2ea554cf..26859915 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-sfr.yaml @@ -464,6 +464,7 @@ blocks: reach ICONR must be a downstream connection for reach IFNO. tagged: false index: true + fk: packagedata.ifno cprior: type: string longname: iprior code diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.json index f40b2c00..9651ce25 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.json @@ -269,7 +269,8 @@ "longname": "vertical connection flag", "description": "integer value set to specify underlying UZF cell that receives water flowing to bottom of cell. If unsaturated zone flow reaches the water table before the cell bottom, then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell.", "tagged": false, - "index": true + "index": true, + "fk": "packagedata.ifno" }, "surfdep": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.toml index 72e2db7a..732aeaff 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.toml @@ -249,6 +249,7 @@ longname = "vertical connection flag" description = "integer value set to specify underlying UZF cell that receives water flowing to bottom of cell. If unsaturated zone flow reaches the water table before the cell bottom, then water is added to the GWF cell instead of flowing to the underlying UZF cell. A value of 0 indicates the UZF cell is not connected to an underlying UZF cell." tagged = false index = true +fk = "packagedata.ifno" [blocks.packagedata.fields.packagedata.item.fields.surfdep] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.yaml index 759872e9..adc0a30b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-uzf.yaml @@ -270,6 +270,7 @@ blocks: of 0 indicates the UZF cell is not connected to an underlying UZF cell. tagged: false index: true + fk: packagedata.ifno surfdep: type: double longname: surface depression depth diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.json index e3b2b65c..ad4b2fdb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.json @@ -233,7 +233,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -269,7 +270,8 @@ "longname": "cell2d number", "description": "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.toml index db605728..1c81ca49 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.toml @@ -215,6 +215,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -245,6 +246,7 @@ longname = "cell2d number" description = "is the cell2d number. Records in the CELL2D block must be listed in consecutive order from 1 to NODES." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.yaml index 938dcc3a..703cecc0 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disu.yaml @@ -250,6 +250,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -278,6 +279,7 @@ blocks: order from 1 to NODES. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.json index aa576ec8..ec4d43e5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.json @@ -187,7 +187,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -222,7 +223,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.toml index 347480fa..2e1726d8 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.toml @@ -171,6 +171,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -200,6 +201,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.yaml index bde6635a..da88a410 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-disv.yaml @@ -179,6 +179,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -206,6 +207,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json index 5ea422f4..bb2ef1be 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.json @@ -156,7 +156,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -191,7 +192,8 @@ "longname": "cell2d number", "description": "is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "fdc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml index 33009908..f2b93ec6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.toml @@ -142,6 +142,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -171,6 +172,7 @@ longname = "cell2d number" description = "is the cell2d number. Records in the cell2d block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.fdc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml index 07c7adff..f1f49a1a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv1d.yaml @@ -148,6 +148,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -175,6 +176,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true fdc: type: double longname: fractional distance to the cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.json index db05910f..f5822d56 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.json @@ -134,7 +134,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -169,7 +170,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.toml index 9396bbd7..201f8e25 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.toml @@ -120,6 +120,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -149,6 +150,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.yaml index 3abecfca..59b68d16 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-disv2d.yaml @@ -131,6 +131,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -158,6 +159,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.json index 4db55d67..fb1eaf13 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.json @@ -125,7 +125,8 @@ "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", "tagged": false, - "index": true + "index": true, + "fk": "olf-cxs.packagedata.idcxs" }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.toml index 0575c75a..137901fe 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.toml @@ -113,6 +113,7 @@ longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false index = true +fk = "olf-cxs.packagedata.idcxs" [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.yaml index 78c708eb..50194010 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-zdg.yaml @@ -123,6 +123,7 @@ blocks: wide channel. tagged: false index: true + fk: olf-cxs.packagedata.idcxs width: type: double longname: width of the zero-depth gradient boundary diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.json index 2b89440b..3f6f603f 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.json @@ -184,7 +184,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -219,7 +220,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.toml index 11cca056..1facaa43 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.toml @@ -168,6 +168,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -197,6 +198,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.yaml index 7e7cf00f..f35cb844 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/prt-disv.yaml @@ -175,6 +175,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -202,6 +203,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json index a77f7723..da93265b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.json @@ -146,7 +146,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -181,7 +182,8 @@ "longname": "cell1d number", "description": "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "fdc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml index 306dc778..f9788c08 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.toml @@ -132,6 +132,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -161,6 +162,7 @@ longname = "cell1d number" description = "is the cell1d number. Records in the cell1d block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell1d.fields.cell1d.item.fields.fdc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml index 100d1123..fafbba22 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv1d.yaml @@ -140,6 +140,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -167,6 +168,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true fdc: type: double longname: fractional distance to the cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.json index cc5d271f..fbe4149d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.json @@ -134,7 +134,8 @@ "longname": "vertex number", "description": "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xv": { "type": "double", @@ -169,7 +170,8 @@ "longname": "cell2d number", "description": "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last.", "tagged": false, - "index": true + "index": true, + "pk": true }, "xc": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.toml index 9165cd7a..6c582c7e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.toml @@ -120,6 +120,7 @@ longname = "vertex number" description = "is the vertex number. Records in the VERTICES block must be listed in consecutive order from 1 to NVERT." tagged = false index = true +pk = true [blocks.vertices.fields.vertices.item.fields.xv] type = "double" @@ -149,6 +150,7 @@ longname = "cell2d number" description = "is the CELL2D number. Records in the CELL2D block must be listed in consecutive order from the first to the last." tagged = false index = true +pk = true [blocks.cell2d.fields.cell2d.item.fields.xc] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.yaml index 25ebaf06..a2393f48 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-disv2d.yaml @@ -131,6 +131,7 @@ blocks: order from 1 to NVERT. tagged: false index: true + pk: true xv: type: double longname: x-coordinate for vertex @@ -158,6 +159,7 @@ blocks: order from the first to the last. tagged: false index: true + pk: true xc: type: double longname: x-coordinate for cell center diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.json index 3fcf388d..c7e2a2a4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.json @@ -125,7 +125,8 @@ "longname": "cross section identifier", "description": "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel.", "tagged": false, - "index": true + "index": true, + "fk": "swf-cxs.packagedata.idcxs" }, "width": { "type": "double", diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.toml index 330e654f..832b2ab9 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.toml @@ -113,6 +113,7 @@ longname = "cross section identifier" description = "is the identifier for the cross section specified in the CXS Package. A value of zero indicates the zero-depth-gradient calculation will use parameters for a hydraulically wide channel." tagged = false index = true +fk = "swf-cxs.packagedata.idcxs" [blocks.period.fields.stress_period_data.item.fields.width] type = "double" diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.yaml index 1c244fab..55379f2b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-zdg.yaml @@ -124,6 +124,7 @@ blocks: wide channel. tagged: false index: true + fk: swf-cxs.packagedata.idcxs width: type: double longname: width of the zero-depth gradient boundary diff --git a/index-node-attributes-plan.md b/index-node-attributes-plan.md index 1dcf63cf..1e46dfca 100644 --- a/index-node-attributes-plan.md +++ b/index-node-attributes-plan.md @@ -55,26 +55,44 @@ Splitting into three orthogonal attributes: `exg-gwtgwt`/`exg-olfgwf`'s `cellidm1`/`cellidm2` (6 exchange types), `gwf-gnc`'s `cellidm`/`cellidn`. -## `pk`/`fk`: unchanged type, narrowed job - -No schema shape change. `_resolve_relations`/`_mark_lonely_pk` keep working as they do today. -The difference is priority: this is no longer blocking anything (flopy4's conversion need is -served by `index`), so it becomes incremental, best-effort relational-documentation work. -Corpus-identified remaining items, from the earlier scan, each independently schedulable: - -- **Lonely-pk allowlist extension** — same shape `_mark_lonely_pk` already detects, just - outside `_LONELY_PK_FIELDS`: DISU/DISV/DISV1D's `vertices.iv`, `cell2d.icell2d`, - `cell1d.icell1d`; SFR's `diversions.iconr`; MAW's `connectiondata.icon`; UZF's - `packagedata.ivertcon`. No longer controversial for DISU/DISV now that `pk` doesn't need to - "earn its keep" via a matching `fk` — marking it is just honestly documenting a real, - if unreferenced, row identifier. -- **Cross-component fk** — `idcxs`: defining side (`chf-cxs`/`olf-cxs`/`swf-cxs`) already - `pk`'d; referencing side (`chf-dfw`, `chf-cdb`, `chf-zdg`, `olf-dfw`, `olf-zdg`, `swf-dfw`, - `swf-zdg`) needs `fk`. Requires a pass that can see across component boundaries — - `_resolve_relations` currently can't. +## `pk`/`fk`: unchanged type, narrowed job (done, 2026-08-20) + +No schema shape change to `pk`/`fk` themselves. `_resolve_relations`/`_mark_lonely_pk` keep +working as they did before. What actually landed, item by item from the original scan: + +- **Lonely-pk allowlist extension** — `_LONELY_PK_FIELDS` widened to `vertices`, `cell2d`, + `cell1d` (DISU/DISV/DISV1D/DISV2D's `iv`/`icell2d`/`icell1d`, 12 components). Genuinely the + same shape `_mark_lonely_pk` already detects (leading required Integer, no fk, no existing + pk) — no longer controversial now that `pk` doesn't need to "earn its keep" via a matching + `fk`. On closer inspection, SFR's `diversions.iconr`, MAW's `connectiondata.icon`, and UZF's + `packagedata.ivertcon` — originally bucketed here too — turned out **not** to fit this + shape at all: none of them is the record's *leading* field (each follows an `ifno`/similar + column that's already `pk`/`fk`'d), so `_mark_lonely_pk`'s single-field heuristic structurally + can't reach them regardless of allowlist. Handled separately, below and under "compound-scoped + fields." +- **Cross-component fk** — `idcxs`: defining side (`chf-cxs`/`olf-cxs`/`swf-cxs` packagedata, + already `pk`'d) now referenced by `chf-cdb`/`chf-zdg`/`olf-zdg`/`swf-zdg` via + `fk = ".packagedata.idcxs"`. Required two fixes, not one: (1) the migration mapper + needed a backfill pass, since `_resolve_relations` is single-component-scoped by construction; + (2) `_validate_fk_fields` itself turned out to have a **latent bug** — despite `dfnspec.md` + documenting `"[component.]block.field"` as a supported hierarchical form, the validator's + `fk.split(".")[0]` only ever took the first dot-segment as the block name, so a real + 3-segment cross-component path like `"chf-cxs.packagedata.idcxs"` would have been + misparsed as block name `"chf-cxs"` and rejected. Nobody had hit this before because nothing + had ever actually set a cross-component `fk`. Fixed to resolve the target component via + `spec.components` when 3 segments are present. `chf-dfw`/`olf-dfw`/`swf-dfw`'s `idcxs` is the + same relation in principle but is an `Array` (a per-cell grid field, `shape=["nodes"]`), which + cannot carry `fk` under the current schema at all (same limitation as item (a) below, never + extended to `pk`/`fk`) — deliberately left alone, not an oversight. - **Compound-scoped fields, now with an honest answer** — SFR `diversions.idv` gets `index` only (correctly — it's not globally unique, so it was never a valid `pk`). `diversions.iconr` - gets `fk = "packagedata.ifno"` (a real reference into reaches) alongside `index`. + gets `fk = "packagedata.ifno"` (a real reference into reaches) alongside `index`. UZF's + `packagedata.ivertcon` turned out to be the same self-referential-fk shape (a UZF cell can + point to another UZF cell in the same list) and got `fk = "packagedata.ifno"` too. MAW's + `connectiondata.icon`, by contrast, has no real target at all — it's the same shape as + `gwf-lak.iconn` (the field that originally motivated `index` in Phase 1): a per-parent + connection sequence number, not globally unique, never referenced by name elsewhere. Correctly + left with `index` only, no `pk`/`fk` — nothing to backfill there. ## Implementation steps (this repo) @@ -138,5 +156,14 @@ Corpus-identified remaining items, from the earlier scan, each independently sch `autotest/dfns/test_schema_relations.py`'s node-sentinel-specific test was replaced with one asserting the new (unremarkable) behavior. Full `autotest/dfns/` suite green; snapshots regenerated (36 files, additive-only — 6 components x 2 fields x 2 dev dirs x 3 formats). -- **Phase 3 (later, incremental, no urgency)**: `pk`/`fk` extensions — lonely-pk allowlist, - cross-component `idcxs`, SFR `diversions` split. +- **Phase 3 (done, 2026-08-20)**: `pk`/`fk` extensions — lonely-pk allowlist widened + (`_LONELY_PK_FIELDS` in `migrate_to_v2_0_0_dev2.py`); a new `_apply_fk_backfill` pass (keyed + on an explicit `_FK_BACKFILL` allowlist, same shape as Phase 2's `_mark_node_refs`) sets `fk` + for UZF's `ivertcon`, SFR's `iconr`, and the 4 cross-component `idcxs` referencing fields; + `_validate_fk_fields`'s cross-component path resolution bug fixed (see above) — a real latent + defect, not something this plan anticipated, found only by actually exercising the documented + 3-segment form for the first time. MAW's `connectiondata.icon` and the 3 `*-dfw` components' + `idcxs` (an `Array`, can't carry `fk`) investigated and deliberately left alone, documented + above rather than silently skipped. Full `autotest/dfns/` suite green; snapshots regenerated + (108 files, additive-only — exactly 12×2 lonely-pk + 1 UZF + 1 SFR + 4 cross-component, + ×2 dev dirs ×3 formats). diff --git a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py index 8ef1a066..3b38e450 100644 --- a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py +++ b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py @@ -375,19 +375,34 @@ def _resolve_record(record: v2.Record) -> v2.Record: } -_LONELY_PK_FIELDS = ("packagedata", "perioddata") +_LONELY_PK_FIELDS = ( + "packagedata", + "perioddata", + # DISU/DISV/DISV1D/DISV2D geometry lists: row identifiers by construction + # (MF6 requires consecutive numbering from 1), never referenced by name + # elsewhere in their own component (the things that reference cell/vertex + # numbers, e.g. `icvert`, are Arrays, which can't carry `pk`/`fk` at all — + # see index-node-attributes-plan.md Phase 3, item (b)). Distinct field + # names because MF6 names the block/list field after the geometry it + # holds, same idiom as period/perioddata above. + "vertices", + "cell2d", + "cell1d", +) def _mark_lonely_pk(blocks: dict[str, v2.Block]) -> dict[str, v2.Block]: """ - Mark the leading identifier column of a ``packagedata`` or ``perioddata`` - recarray as ``pk`` even when nothing else in the component names the same - field, so ``_resolve_relations``'s cross-block signal never fires (e.g. - BUY's ``irhospec``, CSUB's ``icsubno``, ATS's ``iperats``, SPC's - ``bndno``). These are still genuine row identifiers by construction - (MODFLOW rejects a repeated one) — they're just never referenced by name - anywhere else in their own component, unlike SFR/MAW/LAK/UZF's `ifno` - columns, which repeat across multiple blocks. + Mark the leading identifier column of a ``packagedata``/``perioddata``/ + geometry (``vertices``/``cell2d``/``cell1d``) recarray as ``pk`` even when + nothing else in the component names the same field, so + ``_resolve_relations``'s cross-block signal never fires (e.g. BUY's + ``irhospec``, CSUB's ``icsubno``, ATS's ``iperats``, SPC's ``bndno``, + DISV's ``icell2d``). These are still genuine row identifiers by + construction (MODFLOW rejects a repeated one, or requires consecutive + numbering) — they're just never referenced by name anywhere else in their + own component, unlike SFR/MAW/LAK/UZF's `ifno` columns, which repeat + across multiple blocks. Matches on the *list field's* name, not the enclosing block's. MF6's own convention names the period block ``period`` but its list field @@ -397,11 +412,9 @@ def _mark_lonely_pk(blocks: dict[str, v2.Block]) -> dict[str, v2.Block]: Conservative by design: only fires when the list field's item record leads with a required Integer column carrying no ``fk`` and no existing - ``pk`` anywhere in the record. This deliberately excludes lookalikes like - DISU/DISV's ``vertices``/``cell2d`` (row identifiers, but a distinct - grid-geometry concern) and the FK side of relations like - ``gwf-mvr.period.perioddata`` (leads with ``mname1``, a String — not an - Integer identifier at all). + ``pk`` anywhere in the record. This deliberately excludes the FK side of + relations like ``gwf-mvr.period.perioddata`` (leads with ``mname1``, a + String — not an Integer identifier at all). """ updated: dict[str, v2.Block] = {} for block_name, block in blocks.items(): @@ -481,6 +494,77 @@ def _mark_node_refs(name: str, blocks: dict[str, v2.Block]) -> dict[str, v2.Bloc return {**blocks, block_name: new_block} +# Corpus candidates for pk/fk backfill (index-node-attributes-plan.md Phase 3): +# real relational facts the general `_resolve_relations`/`_mark_lonely_pk` +# passes can't infer, backfilled by an explicit, audited allowlist rather than +# derived. Each entry: component -> (block name, list field name, {column: +# fk target}). Unlike `_NODE_REF_FIELDS`, block name and list field name +# aren't assumed equal (MF6's period/perioddata idiom applies to two of these). +# +# - UZF's `ivertcon` is a self-referential fk (a UZF cell may point to another +# UZF cell below it) -- a same-block relation `_resolve_relations` +# explicitly never looks for, and the field isn't named `ifno` so its +# name-match signal wouldn't catch it either way. +# - SFR's `iconr` is the downstream reach receiving diverted water -- a real +# reference into `packagedata`'s reach numbers, not the record's leading +# field (so `_mark_lonely_pk` doesn't apply) and not named `ifno` (so +# `_resolve_relations`'s name-match doesn't fire). `diversions.idv` is a +# genuinely different case -- a diversion number scoped *within* reach +# IFNO, not globally unique -- so it correctly gets no pk/fk, only the +# `index` Phase 1 already set mechanically. +# - `chf/olf/swf-zdg` and `chf-cdb`'s `idcxs` reference the cross-section +# defined by the sibling `*-cxs` component's `packagedata.idcxs` (already +# `pk`'d there since a838d84) -- a cross-component fk `_resolve_relations` +# structurally can't reach (single-component scope). `chf/olf/swf-dfw`'s +# `idcxs` is the same relation in principle but is an `Array` (a per-cell +# grid field, not a list column), which cannot carry `fk` at all under the +# current schema (same limitation as index-node-attributes-plan.md's item +# (a), never extended to `pk`/`fk`) -- deliberately excluded here, not an +# oversight. MAW's `connectiondata.icon` (also flagged as a lonely-pk +# lookalike in earlier scans) is, on inspection, the same compound-scoped +# shape as SFR's `idv`: a per-well connection sequence number, not globally +# unique and never referenced by fk elsewhere -- already fully handled by +# `index` alone, correctly excluded here too. +_FK_BACKFILL: dict[str, tuple[str, str, dict[str, str]]] = { + "gwf-uzf": ("packagedata", "packagedata", {"ivertcon": "packagedata.ifno"}), + "gwf-sfr": ("diversions", "diversions", {"iconr": "packagedata.ifno"}), + "chf-cdb": ("period", "stress_period_data", {"idcxs": "chf-cxs.packagedata.idcxs"}), + "chf-zdg": ("period", "stress_period_data", {"idcxs": "chf-cxs.packagedata.idcxs"}), + "olf-zdg": ("period", "stress_period_data", {"idcxs": "olf-cxs.packagedata.idcxs"}), + "swf-zdg": ("period", "stress_period_data", {"idcxs": "swf-cxs.packagedata.idcxs"}), +} + + +def _apply_fk_backfill(name: str, blocks: dict[str, v2.Block]) -> dict[str, v2.Block]: + """Set `fk` on this component's known-good backfill targets. + + See `_FK_BACKFILL` for why this is an explicit allowlist rather than a + derived/mechanical pass. + """ + entry = _FK_BACKFILL.get(name) + if entry is None: + return blocks + block_name, list_field_name, field_targets = entry + block = blocks.get(block_name) + if block is None: + return blocks + list_field = block.fields.get(list_field_name) + if not isinstance(list_field, v2.List) or not isinstance(list_field.item, v2.Record): + return blocks + item = list_field.item + updates = { + fname: f.model_copy(update={"fk": target}) + for fname, target in field_targets.items() + if isinstance(f := item.fields.get(fname), v2.Integer) and f.fk is None + } + if not updates: + return blocks + new_item = item.model_copy(update={"fields": {**item.fields, **updates}}) + new_list = list_field.model_copy(update={"item": new_item}) + new_block = block.model_copy(update={"fields": {**block.fields, list_field_name: new_list}}) + return {**blocks, block_name: new_block} + + def _fill_period_list_shapes( blocks: dict[str, v2.Block], explicit_dims: dict[str, v2.Dim], @@ -1506,6 +1590,7 @@ def _lookup(rname: str) -> dict | None: # reads or depends on `pk`/`fk` state. blocks = _mark_lonely_pk(blocks) blocks = _mark_node_refs(name, blocks) + blocks = _apply_fk_backfill(name, blocks) dims = {**explicit_dims, **array_dims, **derived_dims} or None d: dict[str, Any] = { diff --git a/modflow_devtools/dfns/schema.py b/modflow_devtools/dfns/schema.py index 495a735c..042d8074 100644 --- a/modflow_devtools/dfns/schema.py +++ b/modflow_devtools/dfns/schema.py @@ -955,8 +955,10 @@ def _validate_fk_fields(component: "ComponentBase", spec: "Dfns") -> None: `fk` value — see `Integer.node`): - Hierarchical path fk ("[component.]block.field", no fk_ref): the named - block must be a list block (in this component, or cross-component if - qualified) whose item has a pk field. + block must be a list block whose item has a pk field. Unqualified + ("block.field"), the block is looked up in this component; qualified + ("component.block.field"), it's looked up in the named component via + `spec.components` instead. - Bare block name fk + fk_ref, or fk_ref alone: fk_ref must name a sibling String field in the same record, whose runtime value identifies the target component (and, with fk, the pk field is looked up in the block @@ -989,12 +991,33 @@ def _check_fields(fields: dict) -> None: # are both resolved from fk_ref's runtime value — no further # static check is possible. elif fk is not None: - block_name = fk.split(".")[0] if "." in fk else fk - list_field = _find_list_in_block(component, block_name) + parts = fk.split(".") + target: ComponentBase + if len(parts) == 3: + component_ref, block_name, _fk_field = parts + resolved = spec.components.get(component_ref) + if resolved is None: + raise ValueError( + f"Field {field.name!r} fk={fk!r}: " + f"component {component_ref!r} not found in spec" + ) + target = resolved + where = f"component {component_ref!r}" + elif len(parts) in (1, 2): + block_name = parts[0] + target = component + where = "this component" + else: + raise ValueError( + f"Field {field.name!r} fk={fk!r}: " + f"must be a bare block name, 'block.field', or " + f"'component.block.field'" + ) + list_field = _find_list_in_block(target, block_name) if list_field is None: raise ValueError( f"Field {field.name!r} fk={fk!r}: " - f"{block_name!r} is not a list block in this component" + f"{block_name!r} is not a list block in {where}" ) item = list_field.item item_fields: dict = item.fields if isinstance(item, Record) else item.arms diff --git a/todo.md b/todo.md index 8f3716bc..9902912e 100644 --- a/todo.md +++ b/todo.md @@ -94,8 +94,9 @@ fixes the confirmed `gwf-lak.iconn` regression directly (`index=True` now set on that field). `schema.json`/`dfnspec.md` updated; full `autotest/dfns/` snapshot suite regenerated (306 files, additive-only diff). Phase 2 (`node` attribute, replacing the - `fk="node"` sentinel) also done — see (e) below. Phase 3 (`pk`/`fk` backfill: items - (b)/(d)/(f) below) remains, tracked in `index-node-attributes-plan.md` rather than here. + `fk="node"` sentinel) also done — see (e) below. Phase 3 (`pk`/`fk` backfill) also done — see + (b)/(d)/(f) below. All decomposed sub-issues (a)–(g) resolved; full detail in + `index-node-attributes-plan.md`. - [x] **Bare (valueless) boolean attribute lines in v1 DFNs migrated as `False` instead of `True`.** v1 syntax allows a boolean attribute's line to carry no value at all (e.g. a @@ -128,7 +129,7 @@ `_fix_lak_relations` splits it into per-arm `lakeno`/`outletno` fk's; marking it pk first leaked a stale `pk=True` into those fk copies via `model_copy`. Full suite green after the reorder, only `bndno` changed. - - [ ] **(b) Same lonely-pk shape, blocked by a hardcoded name allowlist.** DISU/DISV/DISV1D's + - [x] **(b) Same lonely-pk shape, blocked by a hardcoded name allowlist.** DISU/DISV/DISV1D's `vertices.iv`, `cell2d.icell2d`, `cell1d.icell1d` (24 occurrences), SFR's `diversions.iconr`/`idv`, MAW's `connectiondata.icon`, UZF's `packagedata.ivertcon` are the same shape `_mark_lonely_pk` already detects, just under block/field names outside @@ -136,11 +137,28 @@ ("a distinct grid-geometry concern") — open question: is `pk=true` still correct/useful there even though nothing can carry a matching `fk` back (the only things that reference vertex/cell numbers, e.g. `icvert`, are Arrays, which can't hold `fk` at all per (a))? - - [ ] **(d) Cross-component FKs unreachable by construction.** `idcxs`: defining side + Resolved (Phase 3, `index-node-attributes-plan.md`): yes, `pk=true` is still correct/useful + there — it's an honest, if unreferenced, row identifier, same as several `_LONELY_PK_FIELDS` + entries already are. `_LONELY_PK_FIELDS` widened to `vertices`/`cell2d`/`cell1d` (12 + components). The other three named here — SFR `iconr`, MAW `icon`, UZF `ivertcon` — turned + out on inspection *not* to be this shape at all (none is the record's leading field, so + `_mark_lonely_pk` structurally can't reach them regardless of allowlist); resolved instead + under (f) and via a new `_apply_fk_backfill` pass, see below. + - [x] **(d) Cross-component FKs unreachable by construction.** `idcxs`: defining side (`chf-cxs`/`olf-cxs`/`swf-cxs`) already `pk`'d; referencing side (`chf-dfw`, `chf-cdb`, `chf-zdg`, `olf-dfw`, `olf-zdg`, `swf-dfw`, `swf-zdg`) never gets `fk` set, because `_resolve_relations` only ever sees one component's own `blocks` dict. Schema already supports this (`fk = "[component.]block.field"`); migration mapper never attempts it. + Resolved (Phase 3): new `_apply_fk_backfill` pass sets + `fk = ".packagedata.idcxs"` on the 4 referencing fields that are actually Integer + list columns (`chf-cdb`, `chf-zdg`, `olf-zdg`, `swf-zdg`). Turned up a second, deeper bug + while doing this: `_validate_fk_fields` itself mishandled the 3-segment + `"component.block.field"` form (`fk.split(".")[0]` only ever took the first segment as the + block name, so it would've rejected exactly this case) — nobody had hit it before because + no `fk` had ever actually used the cross-component form. Fixed to resolve via + `spec.components`. `chf-dfw`/`olf-dfw`/`swf-dfw`'s `idcxs` is the same relation in principle + but is an `Array` (`shape=["nodes"]`), which can't carry `fk` at all under the current + schema — left alone, documented rather than silently dropped. - [x] **(e) `fk = "node"` grid-cell sentinel, unused.** `exg-*.cellidm1`/`cellidm2` (6 exchange types), `gwf-gnc.cellidm`/`cellidn` look like the schema's existing grid-cell sentinel case, already speced and validated in `schema.py`, never populated by the mapper. @@ -161,8 +179,18 @@ Resolved: `numeric_index` never meant relational identity here, so it doesn't need `pk`/`fk` — it needed `Array.index` (Phase 1, `index-node-attributes-plan.md`), now migrated directly for every `Array(dtype="integer")` field. - - [ ] **(f) Compound keys — no concept for them.** SFR's `diversions.iconr`/`idv` are unique + - [x] **(f) Compound keys — no concept for them.** SFR's `diversions.iconr`/`idv` are unique only per-reach, not table-wide; a blind `pk=true` would misrepresent them. `pk`/`fk` as - specced has no compound-key notion. + specced has no compound-key notion. Resolved (Phase 3): no new concept needed once `pk`/`fk` + aren't asked to double as the serialization signal — `idv` correctly gets `index` only (from + Phase 1, mechanically; it was never a valid `pk`, compound-scoped or not). `iconr` isn't + compound-scoped at all on inspection — its description ("the downstream reach that will + receive the diverted water") makes it a real, globally-scoped reference into + `packagedata.ifno` (reach numbers), so it gets `fk = "packagedata.ifno"` via + `_apply_fk_backfill`, same as any other single-column fk. UZF's `packagedata.ivertcon` + (self-referential: a UZF cell may point to another UZF cell below it) turned out to be the + same single-column-fk shape and got the same treatment. MAW's `connectiondata.icon` is the + one genuine compound-scoped case with no real target (same shape as `gwf-lak.iconn`) — + correctly left with `index` only, nothing more to add. - [x] **(g) `gwf-mvr.id1`/`id2`, `utl-obs.id`/`id2`** — already independently audited (dynamic/name-resolved, not a formal FK). Confirmed by this scan too; no work needed. From 3e36ef90b73c6128496d874c79818d7a50e80027 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Aug 2026 15:59:08 -0400 Subject: [PATCH 08/11] fix(dfns): extend fk to Array, closing the *-dfw idcxs gap Follow-up to the Phase 3 pk/fk backfill commit, which left two cases deliberately alone: MAW's connectiondata.icon (no real target -- same shape as gwf-lak.iconn, index alone is correct and complete, reconfirmed here rather than changed) and chf/olf/swf-dfw's idcxs (a per-cell grid Array referencing the matching *-cxs component's packagedata.idcxs, which couldn't be expressed because Array had no fk attribute at all). The idcxs case turned out to be a real, closable gap rather than a permanent schema limitation: adds Array.fk (dtype="integer" only, via the same validator index already uses) with no pk/fk_ref counterpart (an array has no rows of its own to key, and no sibling record for a runtime component selector). _validate_fk_fields already validates it for free -- its field walk reads fk/fk_ref via getattr regardless of type, so no validator change was needed beyond the attribute existing. Backfills fk = "-cxs.packagedata.idcxs" on all 3 *-dfw components via a new _apply_array_fk_backfill pass. Updates dfnspec.md (Array's fk documented; "Primary and foreign keys" scope note widened) and regenerates schema.json. Full autotest/dfns/ suite green; snapshots regenerated (18 files, additive-only). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01DTmmUhFmfsjihggQUcZ3Ja --- .../__snapshots__/v2.0.0.dev2/chf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev2/chf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev2/chf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev2/olf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev2/olf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev2/olf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev2/swf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev2/swf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev2/swf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev3/chf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev3/chf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev3/chf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev3/olf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev3/olf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev3/olf-dfw.yaml | 1 + .../__snapshots__/v2.0.0.dev3/swf-dfw.json | 1 + .../__snapshots__/v2.0.0.dev3/swf-dfw.toml | 1 + .../__snapshots__/v2.0.0.dev3/swf-dfw.yaml | 1 + docs/md/dfnspec.md | 7 ++- index-node-attributes-plan.md | 33 +++++++++--- .../dfns/migrate_to_v2_0_0_dev2.py | 53 +++++++++++++++---- modflow_devtools/dfns/schema.json | 12 +++++ modflow_devtools/dfns/schema.py | 17 +++++- todo.md | 10 +++- 24 files changed, 130 insertions(+), 20 deletions(-) diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json index 1b802098..1401ded7 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.json @@ -94,6 +94,7 @@ "optional": true, "dtype": "integer", "index": true, + "fk": "chf-cxs.packagedata.idcxs", "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml index 4da15ecd..97ee78b0 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.toml @@ -85,6 +85,7 @@ description = "integer value indication the cross section identifier in the Cros optional = true dtype = "integer" index = true +fk = "chf-cxs.packagedata.idcxs" shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml index d12621a4..4ac42915 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-dfw.yaml @@ -102,5 +102,6 @@ blocks: optional: true dtype: integer index: true + fk: chf-cxs.packagedata.idcxs shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json index 0517c9d0..27460c9e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.json @@ -94,6 +94,7 @@ "optional": true, "dtype": "integer", "index": true, + "fk": "olf-cxs.packagedata.idcxs", "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml index 829413e0..5f6dac79 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.toml @@ -85,6 +85,7 @@ description = "integer value indication the cross section identifier in the Cros optional = true dtype = "integer" index = true +fk = "olf-cxs.packagedata.idcxs" shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml index db8300c7..8d1085dc 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-dfw.yaml @@ -102,5 +102,6 @@ blocks: optional: true dtype: integer index: true + fk: olf-cxs.packagedata.idcxs shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json index 1376ca8e..3769ea16 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.json @@ -94,6 +94,7 @@ "optional": true, "dtype": "integer", "index": true, + "fk": "swf-cxs.packagedata.idcxs", "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml index a2d27e50..d218b4d5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.toml @@ -85,6 +85,7 @@ description = "integer value indication the cross section identifier in the Cros optional = true dtype = "integer" index = true +fk = "swf-cxs.packagedata.idcxs" shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml index f3c6922c..86d47e23 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/swf-dfw.yaml @@ -102,5 +102,6 @@ blocks: optional: true dtype: integer index: true + fk: swf-cxs.packagedata.idcxs shape: - nodes diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json index ef0a52a4..f60d8d04 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.json @@ -99,6 +99,7 @@ "optional": true, "dtype": "integer", "index": true, + "fk": "chf-cxs.packagedata.idcxs", "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml index ee703e1f..8558b6e4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.toml @@ -88,6 +88,7 @@ description = "integer value indication the cross section identifier in the Cros optional = true dtype = "integer" index = true +fk = "chf-cxs.packagedata.idcxs" shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml index 53512f24..9349526d 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-dfw.yaml @@ -105,6 +105,7 @@ blocks: optional: true dtype: integer index: true + fk: chf-cxs.packagedata.idcxs shape: - nodes memory: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json index cdeed938..c7ff0356 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.json @@ -99,6 +99,7 @@ "optional": true, "dtype": "integer", "index": true, + "fk": "olf-cxs.packagedata.idcxs", "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml index e46af588..1b34786a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.toml @@ -88,6 +88,7 @@ description = "integer value indication the cross section identifier in the Cros optional = true dtype = "integer" index = true +fk = "olf-cxs.packagedata.idcxs" shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml index 129e27c6..92042520 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-dfw.yaml @@ -105,6 +105,7 @@ blocks: optional: true dtype: integer index: true + fk: olf-cxs.packagedata.idcxs shape: - nodes memory: diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json index 443561ae..39a6044c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.json @@ -99,6 +99,7 @@ "optional": true, "dtype": "integer", "index": true, + "fk": "swf-cxs.packagedata.idcxs", "shape": [ "nodes" ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml index 1e4acc0d..3b5ac08c 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.toml @@ -88,6 +88,7 @@ description = "integer value indication the cross section identifier in the Cros optional = true dtype = "integer" index = true +fk = "swf-cxs.packagedata.idcxs" shape = [ "nodes", ] diff --git a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml index 2c7f7a58..fecbfd1e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/swf-dfw.yaml @@ -105,6 +105,7 @@ blocks: optional: true dtype: integer index: true + fk: swf-cxs.packagedata.idcxs shape: - nodes memory: diff --git a/docs/md/dfnspec.md b/docs/md/dfnspec.md index f73cc5f3..06506e8c 100644 --- a/docs/md/dfnspec.md +++ b/docs/md/dfnspec.md @@ -71,6 +71,7 @@ This document describes the MODFLOW 6 component definition (DFN) system. This sy - [`shape`](#shape) - [`time_series`](#time_series-3) - [`index`](#index-1) + - [`fk`](#fk-2) - [Record](#record) - [Type-specific attributes](#type-specific-attributes-7) - [`fields`](#fields-2) @@ -453,6 +454,10 @@ A 1D array appearing as a subfield of a record is called an **inline array**. In `boolean (default: false)`. Marks the array's elements as 1-based indices requiring MF6's 1-based (file) <-> 0-based (Python) translation (e.g. `icvert`, `ja`, `irch`, `ievt`). Only valid when `dtype` is `"integer"`. +###### `fk` + +`string | null (default: null)`. Marks the array's (nonzero) elements as a foreign key: a per-grid-cell reference to a row (by `pk`) in another list, rather than the per-list-row reference a scalar `fk` expresses (e.g. a grid-wide array giving each cell's cross-section id, referencing the cross-section package's `packagedata`). Only valid when `dtype` is `"integer"`. Hierarchical path form only (`"[component.]block.field"`) — an array has no `fk_ref` counterpart, since it has no sibling record to carry a runtime component-selector field, and no `pk` counterpart, since it has no rows of its own to be a key of. See "Primary/foreign keys". + #### Record Type `record`. Product type. In MF6 input files, records appear on a single line. Record subfields may or may not be `tagged`. While blocks can be considered product types also, in the DFN specification only records are considered fields; blocks are considered named collections of related fields. @@ -648,7 +653,7 @@ Examples: Sometimes a column in one list identifies a row in another list. This can be conceptualized as a primary key (PK) / foreign key (FK) relation. Integers and strings may encode PK/FK semantics with attributes `pk`, `fk`, and `fk_ref`. A column referencing a grid cell instead of another list's row is a distinct concern, handled by the `node` attribute (see [Integer](#integer)) rather than `pk`/`fk` — grid cells are resolved from the parent model's grid (DIS/DISV/DISU) at runtime, not looked up via a `pk` column. -**Note**: PK/FK attributes are only valid on integer and string fields appearing as columns in a tabular (i.e. regular) list's record item type. +**Note**: `pk`/`fk_ref` are only valid on integer and string fields appearing as columns in a tabular (i.e. regular) list's record item type. `fk` is valid there too, and additionally on integer-`dtype` `Array` fields (see [Array](#array)) — there it references another list's row per grid cell rather than per list row, and only the hierarchical-path form applies (no `fk_ref` counterpart, since an array has no sibling record to carry a runtime component selector). The `fk` attribute can take one of two forms: diff --git a/index-node-attributes-plan.md b/index-node-attributes-plan.md index 1e46dfca..ad120da7 100644 --- a/index-node-attributes-plan.md +++ b/index-node-attributes-plan.md @@ -81,9 +81,9 @@ working as they did before. What actually landed, item by item from the original misparsed as block name `"chf-cxs"` and rejected. Nobody had hit this before because nothing had ever actually set a cross-component `fk`. Fixed to resolve the target component via `spec.components` when 3 segments are present. `chf-dfw`/`olf-dfw`/`swf-dfw`'s `idcxs` is the - same relation in principle but is an `Array` (a per-cell grid field, `shape=["nodes"]`), which - cannot carry `fk` under the current schema at all (same limitation as item (a) below, never - extended to `pk`/`fk`) — deliberately left alone, not an oversight. + same relation in principle but is an `Array` (a per-cell grid field, `shape=["nodes"]`) — + see the Phase 3 addendum below: `Array` now carries `fk` too, so this is resolved as well, + not left alone. - **Compound-scoped fields, now with an honest answer** — SFR `diversions.idv` gets `index` only (correctly — it's not globally unique, so it was never a valid `pk`). `diversions.iconr` gets `fk = "packagedata.ifno"` (a real reference into reaches) alongside `index`. UZF's @@ -163,7 +163,26 @@ working as they did before. What actually landed, item by item from the original `_validate_fk_fields`'s cross-component path resolution bug fixed (see above) — a real latent defect, not something this plan anticipated, found only by actually exercising the documented 3-segment form for the first time. MAW's `connectiondata.icon` and the 3 `*-dfw` components' - `idcxs` (an `Array`, can't carry `fk`) investigated and deliberately left alone, documented - above rather than silently skipped. Full `autotest/dfns/` suite green; snapshots regenerated - (108 files, additive-only — exactly 12×2 lonely-pk + 1 UZF + 1 SFR + 4 cross-component, - ×2 dev dirs ×3 formats). + `idcxs` (an `Array`, can't carry `fk`) investigated and initially left alone (documented + rather than silently skipped) — see the addendum immediately below for `idcxs`; MAW's `icon` + remains correctly out of scope permanently, not a follow-up. Full `autotest/dfns/` suite + green; snapshots regenerated (108 files, additive-only — exactly 12×2 lonely-pk + 1 UZF + + 1 SFR + 4 cross-component, ×2 dev dirs ×3 formats). + +**Phase 3 addendum (done, 2026-08-20)**: revisited the two cases left alone above. +`connectiondata.icon` (MAW) reconfirmed as permanently out of scope — same no-real-target +shape as `gwf-lak.iconn`, `index` alone is the complete, correct answer, no code change +possible or needed. `chf/olf/swf-dfw`'s `idcxs`, by contrast, was a genuine gap, not a +permanent limitation: added `fk: str | None = None` to `Array` (integer-`dtype`-only, via the +same `_check_index_dtype`-style validator `index` already used), which `_validate_fk_fields` +picks up for free — its `_check_fields` walker reads `fk`/`fk_ref` via `getattr` on every +field regardless of type, so no validator code change was needed beyond the attribute +existing. No `pk` or `fk_ref` counterpart added to `Array`: an array has no rows of its own to +be a key of, and no sibling record to carry a runtime component-selector field for `fk_ref`. +Backfilled via a new `_apply_array_fk_backfill` pass (`_ARRAY_FK_BACKFILL` allowlist, +structurally simpler than `_apply_fk_backfill` since it targets a bare block field, not a list +item column) — `fk = "-cxs.packagedata.idcxs"` on all 3 `*-dfw` components. +`dfnspec.md` updated (`fk` documented under Array's type-specific attributes; "Primary and +foreign keys" section's scope note widened). `schema.json` regenerated. Full `autotest/dfns/` +suite green; snapshots regenerated (18 files — 3 components × 2 dev dirs × 3 formats, +additive-only). diff --git a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py index 3b38e450..d1925134 100644 --- a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py +++ b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py @@ -516,15 +516,14 @@ def _mark_node_refs(name: str, blocks: dict[str, v2.Block]) -> dict[str, v2.Bloc # defined by the sibling `*-cxs` component's `packagedata.idcxs` (already # `pk`'d there since a838d84) -- a cross-component fk `_resolve_relations` # structurally can't reach (single-component scope). `chf/olf/swf-dfw`'s -# `idcxs` is the same relation in principle but is an `Array` (a per-cell -# grid field, not a list column), which cannot carry `fk` at all under the -# current schema (same limitation as index-node-attributes-plan.md's item -# (a), never extended to `pk`/`fk`) -- deliberately excluded here, not an -# oversight. MAW's `connectiondata.icon` (also flagged as a lonely-pk -# lookalike in earlier scans) is, on inspection, the same compound-scoped -# shape as SFR's `idv`: a per-well connection sequence number, not globally -# unique and never referenced by fk elsewhere -- already fully handled by -# `index` alone, correctly excluded here too. +# `idcxs` is the same relation but is an `Array` (a per-cell grid field, not +# a list column) -- see `_ARRAY_FK_BACKFILL` below, not here. +# +# MAW's `connectiondata.icon` (also flagged as a lonely-pk lookalike in +# earlier scans) is, on inspection, the same compound-scoped shape as SFR's +# `idv`: a per-well connection sequence number, not globally unique and never +# referenced by fk elsewhere -- already fully handled by `index` alone, +# deliberately excluded from this allowlist, not an oversight. _FK_BACKFILL: dict[str, tuple[str, str, dict[str, str]]] = { "gwf-uzf": ("packagedata", "packagedata", {"ivertcon": "packagedata.ifno"}), "gwf-sfr": ("diversions", "diversions", {"iconr": "packagedata.ifno"}), @@ -565,6 +564,41 @@ def _apply_fk_backfill(name: str, blocks: dict[str, v2.Block]) -> dict[str, v2.B return {**blocks, block_name: new_block} +# `chf/olf/swf-dfw`'s `idcxs` is a per-cell grid array (`griddata` block, +# dtype="integer", shape=["nodes"]), not a list column, so it can't go through +# `_apply_fk_backfill` above (which targets a List item's Record). It's the +# same cross-section relation as `_FK_BACKFILL`'s `*-zdg`/`chf-cdb` entries, +# now expressible directly since `Array.fk` exists (index-node-attributes-plan.md +# Phase 3 addendum). Each entry: component -> (block name, field name, fk target). +_ARRAY_FK_BACKFILL: dict[str, tuple[str, str, str]] = { + "chf-dfw": ("griddata", "idcxs", "chf-cxs.packagedata.idcxs"), + "olf-dfw": ("griddata", "idcxs", "olf-cxs.packagedata.idcxs"), + "swf-dfw": ("griddata", "idcxs", "swf-cxs.packagedata.idcxs"), +} + + +def _apply_array_fk_backfill(name: str, blocks: dict[str, v2.Block]) -> dict[str, v2.Block]: + """Set `fk` on this component's known-good Array backfill target. + + See `_ARRAY_FK_BACKFILL` for why this is a separate, explicit allowlist + rather than folded into `_apply_fk_backfill`. + """ + entry = _ARRAY_FK_BACKFILL.get(name) + if entry is None: + return blocks + block_name, field_name, target = entry + block = blocks.get(block_name) + if block is None: + return blocks + field = block.fields.get(field_name) + if not isinstance(field, v2.Array) or field.fk is not None: + return blocks + new_block = block.model_copy( + update={"fields": {**block.fields, field_name: field.model_copy(update={"fk": target})}} + ) + return {**blocks, block_name: new_block} + + def _fill_period_list_shapes( blocks: dict[str, v2.Block], explicit_dims: dict[str, v2.Dim], @@ -1591,6 +1625,7 @@ def _lookup(rname: str) -> dict | None: blocks = _mark_lonely_pk(blocks) blocks = _mark_node_refs(name, blocks) blocks = _apply_fk_backfill(name, blocks) + blocks = _apply_array_fk_backfill(name, blocks) dims = {**explicit_dims, **array_dims, **derived_dims} or None d: dict[str, Any] = { diff --git a/modflow_devtools/dfns/schema.json b/modflow_devtools/dfns/schema.json index 99b43d74..86c9b82d 100644 --- a/modflow_devtools/dfns/schema.json +++ b/modflow_devtools/dfns/schema.json @@ -126,6 +126,18 @@ "default": false, "title": "Index", "type": "boolean" + }, + "fk": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Fk" } }, "required": [ diff --git a/modflow_devtools/dfns/schema.py b/modflow_devtools/dfns/schema.py index 042d8074..5f149a14 100644 --- a/modflow_devtools/dfns/schema.py +++ b/modflow_devtools/dfns/schema.py @@ -134,6 +134,14 @@ class Array(FieldBase): # 1-based (file) <-> 0-based (Python) translation. Only meaningful when # dtype == "integer"; see docs/md/dfnspec.md. index: bool = False + # Foreign key: nonzero elements reference a row (by pk) in another list, + # per-grid-cell rather than per-list-row (e.g. a per-cell cross-section + # id). Only meaningful when dtype == "integer". Hierarchical path form + # only ("[component.]block.field") — no `pk` or `fk_ref` counterpart, since + # an array has no rows of its own to be a key of, and there's no sibling + # String field to carry a runtime component reference. See dfnspec.md, + # "Primary and foreign keys". + fk: str | None = None @model_validator(mode="after") def _check_index_dtype(self) -> "Array": @@ -141,6 +149,10 @@ def _check_index_dtype(self) -> "Array": raise ValueError( f"Array {self.name!r}: index=True requires dtype='integer', got {self.dtype!r}" ) + if self.fk is not None and self.dtype != "integer": + raise ValueError( + f"Array {self.name!r}: fk requires dtype='integer', got {self.dtype!r}" + ) return self @@ -948,7 +960,10 @@ def _validate_list_shape_element( def _validate_fk_fields(component: "ComponentBase", spec: "Dfns") -> None: """ - For every Integer/String field with fk or fk_ref set, validate structure. + For every Integer/String/Array field with fk or fk_ref set, validate + structure. Array's `fk` (per-grid-cell rather than per-list-row) only + ever uses the hierarchical-path form below — it has no `pk`/`fk_ref` + counterpart (see `Array.fk`). Two forms (see docs/md/dfnspec.md, "Primary and foreign keys"); grid-cell references are a separate mechanism entirely (the `node` attribute, not an diff --git a/todo.md b/todo.md index 9902912e..e888b30d 100644 --- a/todo.md +++ b/todo.md @@ -157,8 +157,14 @@ block name, so it would've rejected exactly this case) — nobody had hit it before because no `fk` had ever actually used the cross-component form. Fixed to resolve via `spec.components`. `chf-dfw`/`olf-dfw`/`swf-dfw`'s `idcxs` is the same relation in principle - but is an `Array` (`shape=["nodes"]`), which can't carry `fk` at all under the current - schema — left alone, documented rather than silently dropped. + but is an `Array` (`shape=["nodes"]`) — initially left alone since `Array` couldn't carry + `fk` at all, then resolved in a follow-up pass the same day: added `Array.fk` (dtype= + "integer" only; no `pk`/`fk_ref` counterpart — an array has no rows of its own to key, and + no sibling record for a runtime component selector), which `_validate_fk_fields` already + validates for free via its `getattr`-based field walk. Backfilled via a new + `_apply_array_fk_backfill` pass (`_ARRAY_FK_BACKFILL` allowlist) on all 3 `*-dfw` + components. MAW's `connectiondata.icon` (below, under (f)) reconfirmed as permanently out + of scope in the same pass — not a parallel gap, just double-checked. - [x] **(e) `fk = "node"` grid-cell sentinel, unused.** `exg-*.cellidm1`/`cellidm2` (6 exchange types), `gwf-gnc.cellidm`/`cellidn` look like the schema's existing grid-cell sentinel case, already speced and validated in `schema.py`, never populated by the mapper. From 65388cd24ed308d0df798c57ee9f6be905dfd6a7 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Aug 2026 16:09:19 -0400 Subject: [PATCH 09/11] chore: remove todo.md and index-node-attributes-plan.md from version control Working notes for the dfns index/node/pk/fk migration plan, now that all phases described in them are complete. Kept locally, untracked, rather than deleted outright. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01DTmmUhFmfsjihggQUcZ3Ja --- index-node-attributes-plan.md | 188 ------------------------------- todo.md | 202 ---------------------------------- 2 files changed, 390 deletions(-) delete mode 100644 index-node-attributes-plan.md delete mode 100644 todo.md diff --git a/index-node-attributes-plan.md b/index-node-attributes-plan.md deleted file mode 100644 index ad120da7..00000000 --- a/index-node-attributes-plan.md +++ /dev/null @@ -1,188 +0,0 @@ -# `index` and `node` attributes: implementation plan - -Working plan for closing devtools gap #2 (`dev3-migration-gaps.md`, `todo.md`) properly, -rather than continuing to stretch `pk`/`fk` to cover cases they don't fit. Context and full -reasoning live in conversation history; this doc is the standalone plan for implementation -and for handing off to flopy4. - -## The core decision - -`pk`/`fk` were being asked to answer two unrelated questions at once: - -1. **Serialization**: does this integer need MF6's 1-based↔0-based translation on read/write? -2. **Relational identity**: does this column identify a row (`pk`), or point at one (`fk`)? - -Evidence this conflation was already broken: flopy4 derives its `is_index`/`role="feature_id"` -conversion trigger from "`pk` or `fk` is set," then had to bolt on an `isinstance(col, Integer)` -guard after a `pk`/`fk` on a String field (MVR's `pname`) crashed `int()` — proof the vocabulary -was carrying a job it was never typed to carry safely. - -Splitting into three orthogonal attributes: - -- **`index`** — pure serialization fact. Doesn't claim uniqueness, doesn't claim to point - anywhere. -- **`node`** — pure "this is a grid-cell reference" fact, resolved via DIS/DISV/DISU geometry - at runtime, not via a schema `pk` lookup. -- **`pk`/`fk`** — unchanged shape, but now *only* mean relational identity (a value that - identifies or points at a list row). No longer required to also signal serialization. - -## `index: bool = False` - -- Valid on: `Integer` scalars (anywhere — list-item column, record subfield, block field), - and `Array` with `dtype: "integer"` (meaning: *the array's elements* are 1-based indices — - covers `icvert`, `ja`, `irch`, `ievt`). -- **Not valid on `String`** — enforced by a schema validator, not just convention. This is the - fix for the exact bug flopy4 patched around; the schema should guarantee it so nobody needs - a defensive `isinstance` check downstream again. -- Migration: **direct copy** from v1's `numeric_index` wherever the field is `Integer` or - `Array(dtype="integer")`. No heuristics, no block-name matching — same mechanical shape as - the existing `layered`/`time_series` migration. String fields with v1 `numeric_index: true` - (`utl-obs.id`/`id2`) get nothing, consistent with the existing conclusion that they're - dynamic/non-numeric, not an oversight. - -## `node: bool = False` - -- Valid on: `Integer` scalars in list-item-column position (same placement `fk` currently - requires). -- Meaning: this value is a grid-cell reference resolved from the parent model's grid at - runtime — a structurally different resolution path than `fk` (geometry lookup, not - pk lookup). -- Replaces the `fk="node"` sentinel. `fk` no longer accepts `"node"` as a value; it always - means "resolves to a `pk` field," full stop. `schema.py`'s fk-structure validator loses its - `fk == "node"` exemption branch and becomes a single-invariant check. -- Migration: **not** part of the direct/mechanical pass — same audit-as-you-go category as - `pk`/`fk` backfill. Known corpus candidates: `exg-chfgwf`/`exg-gwegwe`/`exg-gwfgwf`/ - `exg-gwtgwt`/`exg-olfgwf`'s `cellidm1`/`cellidm2` (6 exchange types), `gwf-gnc`'s - `cellidm`/`cellidn`. - -## `pk`/`fk`: unchanged type, narrowed job (done, 2026-08-20) - -No schema shape change to `pk`/`fk` themselves. `_resolve_relations`/`_mark_lonely_pk` keep -working as they did before. What actually landed, item by item from the original scan: - -- **Lonely-pk allowlist extension** — `_LONELY_PK_FIELDS` widened to `vertices`, `cell2d`, - `cell1d` (DISU/DISV/DISV1D/DISV2D's `iv`/`icell2d`/`icell1d`, 12 components). Genuinely the - same shape `_mark_lonely_pk` already detects (leading required Integer, no fk, no existing - pk) — no longer controversial now that `pk` doesn't need to "earn its keep" via a matching - `fk`. On closer inspection, SFR's `diversions.iconr`, MAW's `connectiondata.icon`, and UZF's - `packagedata.ivertcon` — originally bucketed here too — turned out **not** to fit this - shape at all: none of them is the record's *leading* field (each follows an `ifno`/similar - column that's already `pk`/`fk`'d), so `_mark_lonely_pk`'s single-field heuristic structurally - can't reach them regardless of allowlist. Handled separately, below and under "compound-scoped - fields." -- **Cross-component fk** — `idcxs`: defining side (`chf-cxs`/`olf-cxs`/`swf-cxs` packagedata, - already `pk`'d) now referenced by `chf-cdb`/`chf-zdg`/`olf-zdg`/`swf-zdg` via - `fk = ".packagedata.idcxs"`. Required two fixes, not one: (1) the migration mapper - needed a backfill pass, since `_resolve_relations` is single-component-scoped by construction; - (2) `_validate_fk_fields` itself turned out to have a **latent bug** — despite `dfnspec.md` - documenting `"[component.]block.field"` as a supported hierarchical form, the validator's - `fk.split(".")[0]` only ever took the first dot-segment as the block name, so a real - 3-segment cross-component path like `"chf-cxs.packagedata.idcxs"` would have been - misparsed as block name `"chf-cxs"` and rejected. Nobody had hit this before because nothing - had ever actually set a cross-component `fk`. Fixed to resolve the target component via - `spec.components` when 3 segments are present. `chf-dfw`/`olf-dfw`/`swf-dfw`'s `idcxs` is the - same relation in principle but is an `Array` (a per-cell grid field, `shape=["nodes"]`) — - see the Phase 3 addendum below: `Array` now carries `fk` too, so this is resolved as well, - not left alone. -- **Compound-scoped fields, now with an honest answer** — SFR `diversions.idv` gets `index` - only (correctly — it's not globally unique, so it was never a valid `pk`). `diversions.iconr` - gets `fk = "packagedata.ifno"` (a real reference into reaches) alongside `index`. UZF's - `packagedata.ivertcon` turned out to be the same self-referential-fk shape (a UZF cell can - point to another UZF cell in the same list) and got `fk = "packagedata.ifno"` too. MAW's - `connectiondata.icon`, by contrast, has no real target at all — it's the same shape as - `gwf-lak.iconn` (the field that originally motivated `index` in Phase 1): a per-parent - connection sequence number, not globally unique, never referenced by name elsewhere. Correctly - left with `index` only, no `pk`/`fk` — nothing to backfill there. - -## Implementation steps (this repo) - -1. **`schema.py`**: add `index: bool = False` to `Integer` and to `Array` (validator: only - when `dtype == "integer"`); add `node: bool = False` to `Integer`; remove `"node"` from - `fk`'s accepted forms; simplify the fk-structure validator (drop the `node` exemption). -2. **`dfnspec.md`**: document `index` under Integer and Array type-specific attributes; - document `node` under Integer; rewrite the "Primary and foreign keys" section's "Grid cell - sentinel" form out, replacing it with a description of `node` as a distinct attribute. -3. **`schema.json`**: regenerate for the new attributes. (Note: this file was already stale - before this work — missing `removed`/`deprecated`/`layered` on `Array` — so full - regeneration will surface that unrelated drift too; reconcile it in the same pass rather - than hand-editing around it again.) -4. **`migrate_to_v2_0_0_dev2.py`** (or wherever the per-field mapper lives): - - Direct `index` migration: for `Integer` fields and `Array(dtype="integer")` fields, - `index = try_parse_bool(f.get("numeric_index"), False)`. - - New `_mark_node_refs`-style pass, audited per field, for the exchange `cellidm1`/ - `cellidm2` and GNC `cellidm`/`cellidn` cases. -5. `pk`/`fk` extensions (separate, lower-priority commits, any order): lonely-pk allowlist - widening; cross-component `idcxs` pass; SFR `diversions` fk/index split. -6. Update `todo.md` to replace the (a)–(g) bucket list with these concrete, independently - trackable items. -7. Full `autotest/dfns/` suite + snapshot regeneration after each step. - -## What flopy4 needs to change (separate repo, coordinate before/alongside) - -- Switch `is_index`/`role="feature_id"` derivation from "`pk` or `fk` is set, Integer-only" to - reading `index` directly. Drop the defensive `isinstance(col, Integer)` patch — no longer - needed, the schema enforces it now. -- If/when typed grid-cell references are wanted (the deferred "Union-item-class shape" work), - consume `node` instead of checking `fk == "node"`. -- No urgency on the `pk`/`fk` backfill items above — those remain best-effort relational - documentation, not something flopy4 should block on. - -## Sequencing - -- **Phase 1 (done, 2026-08-20)**: `index` — schema + validator + direct migration. This is - the piece that actually unblocks flopy4 and closes gap #2's practical urgency. Small, - mechanical, low-risk. Landed: `Integer.index`/`Array.index` in `schema.py` (validator bars - `index=True` off `dtype != "integer"` Arrays; `String` never gets the field at all), - `dfnspec.md` documented, `schema.json` regenerated (also picked up pre-existing unrelated - drift — `removed`/`deprecated`/`layered` on `Array` — as anticipated above), - `migrate_to_v2_0_0_dev2.py` populates `index` directly from v1 `numeric_index` for every - `Integer`/`Array(dtype="integer")` field. Confirmed fixes the `gwf-lak.iconn` regression - from `todo.md`. Full `autotest/dfns/` suite green; snapshots regenerated (306 files, - additive-only diff — every change is a bare `"index": true`/`index = true` addition, no - removals beyond JSON trailing-comma churn). -- **Phase 2 (done, 2026-08-20)**: `node` — schema + validator + `fk="node"` removal + the - handful of exchange/GNC backfills. Well-scoped enough to go in the same pass as Phase 1. - Landed: `Integer.node` in `schema.py` (no placement validator — same as `pk`/`fk`, this is - a documentation-level convention, not schema-enforced); `_validate_fk_fields`'s `fk == "node"` - exemption removed, now a single hierarchical-path-vs-fk_ref invariant check (an unqualified - `fk = "node"` is no longer special — it must resolve to an actual list block like any other - bare fk value, which in practice means nobody will set it, achieving the deprecation without - a hard reject); `dfnspec.md` updated (`node` documented under Integer, "Primary and foreign - keys" section's grid-cell-sentinel form replaced with a pointer to `node`); `schema.json` - regenerated; a new `_mark_node_refs` pass in `migrate_to_v2_0_0_dev2.py` backfills the 6 - corpus candidates by an explicit per-component allowlist (`_NODE_REF_FIELDS`) — the 5 - exchange types' `exchangedata.cellidm1`/`cellidm2` and `gwf-gnc.gncdata.cellidm`/`cellidn` — - since (unlike `index`) v1 has no attribute this can be migrated from mechanically. - `autotest/dfns/test_schema_relations.py`'s node-sentinel-specific test was replaced with one - asserting the new (unremarkable) behavior. Full `autotest/dfns/` suite green; snapshots - regenerated (36 files, additive-only — 6 components x 2 fields x 2 dev dirs x 3 formats). -- **Phase 3 (done, 2026-08-20)**: `pk`/`fk` extensions — lonely-pk allowlist widened - (`_LONELY_PK_FIELDS` in `migrate_to_v2_0_0_dev2.py`); a new `_apply_fk_backfill` pass (keyed - on an explicit `_FK_BACKFILL` allowlist, same shape as Phase 2's `_mark_node_refs`) sets `fk` - for UZF's `ivertcon`, SFR's `iconr`, and the 4 cross-component `idcxs` referencing fields; - `_validate_fk_fields`'s cross-component path resolution bug fixed (see above) — a real latent - defect, not something this plan anticipated, found only by actually exercising the documented - 3-segment form for the first time. MAW's `connectiondata.icon` and the 3 `*-dfw` components' - `idcxs` (an `Array`, can't carry `fk`) investigated and initially left alone (documented - rather than silently skipped) — see the addendum immediately below for `idcxs`; MAW's `icon` - remains correctly out of scope permanently, not a follow-up. Full `autotest/dfns/` suite - green; snapshots regenerated (108 files, additive-only — exactly 12×2 lonely-pk + 1 UZF + - 1 SFR + 4 cross-component, ×2 dev dirs ×3 formats). - -**Phase 3 addendum (done, 2026-08-20)**: revisited the two cases left alone above. -`connectiondata.icon` (MAW) reconfirmed as permanently out of scope — same no-real-target -shape as `gwf-lak.iconn`, `index` alone is the complete, correct answer, no code change -possible or needed. `chf/olf/swf-dfw`'s `idcxs`, by contrast, was a genuine gap, not a -permanent limitation: added `fk: str | None = None` to `Array` (integer-`dtype`-only, via the -same `_check_index_dtype`-style validator `index` already used), which `_validate_fk_fields` -picks up for free — its `_check_fields` walker reads `fk`/`fk_ref` via `getattr` on every -field regardless of type, so no validator code change was needed beyond the attribute -existing. No `pk` or `fk_ref` counterpart added to `Array`: an array has no rows of its own to -be a key of, and no sibling record to carry a runtime component-selector field for `fk_ref`. -Backfilled via a new `_apply_array_fk_backfill` pass (`_ARRAY_FK_BACKFILL` allowlist, -structurally simpler than `_apply_fk_backfill` since it targets a bare block field, not a list -item column) — `fk = "-cxs.packagedata.idcxs"` on all 3 `*-dfw` components. -`dfnspec.md` updated (`fk` documented under Array's type-specific attributes; "Primary and -foreign keys" section's scope note widened). `schema.json` regenerated. Full `autotest/dfns/` -suite green; snapshots regenerated (18 files — 3 components × 2 dev dirs × 3 formats, -additive-only). diff --git a/todo.md b/todo.md deleted file mode 100644 index e888b30d..00000000 --- a/todo.md +++ /dev/null @@ -1,202 +0,0 @@ -# Done - -- block.optional derived from fields (any required field → mandatory; all optional → optional) -- block repetition × optionality interaction clarified in spec (2×2 matrix) -- self-sizing arrays: position-based rules replace string-specific rules - - self-sizing (shape=[]) valid at top level and as rightmost record subfield - - non-rightmost record subfield with no shape is a validation error - - any dtype, not just string -- array dimension attribute: valid on any self-sizing array (not string-only) - - dimension sources provide dynamic element count to other arrays' shape expressions -- schema version consistency validated across components in a DfnSpec -- bound-annotated shape expressions (<, >, <=, >=) parsed and validated -- intra-record sibling scope restricted to Integer (Array.dimension="record" removed) -- dfnspec.md updated throughout to reflect all of the above - -# Todo - -## v1 → v2 mapper gaps (now visible from TOML output) - -- [x] period blocks should have `repeats: true` — mapper never sets this on any block -- [x] `auxiliary` (and similar self-sizing string arrays that define a named set) should have - `dimension: "component"` set by the mapper — the v1 DFN shape `(naux)` is the signal - that the array's length defines a dimension used elsewhere -- [x] `model_dump(exclude_none=True)` serializes False boolean defaults verbosely - (developmode, netcdf, time_series, pk, etc.) — replaced with `_to_toml_dict` which - introspects `field_info.default is False` to suppress them without hardcoding names -- [x] single-file v2 conversion in dfn2toml.py skips the v1→v2 mapping step (passes raw - Dfn dataclass to _convert instead of a mapped Component) -- [x] period block list structure: `map_period_block` removed; recarray List structure - preserved as-is from v1 → v2 mapping -- [x] `repeats: true` now derived from `block_variable` attribute on v1 FieldV1 (not - hardcoded to "period"); `solutiongroup` in sim-nam correctly gets `repeats: true` -- [x] arithmetic shape elements (`dim [+-] integer`, e.g. `nseg-1`) added to validator -- stress period list fields should be explicitly marked optional or not in the mapper - (most are optional but some are required) - -## v1 → v2 migration gaps found during flopy4 dev3 migration (2026-08-18) - -- [x] `Array.repeat` was never populated by migration, and turned out not to be needed: - removed instead of fixed. History (see git log on `modflow_devtools/dfns/schema.py`): - pre-#311, the v1→v2 mapping was a loose passthrough (raw v1 field dict, lightly sorted), - so v1's `repeating: true` survived into dev0/dev1 output automatically with no dedicated - code. #311's schema rewrite switched to a strict, fully-typed schema and redesigned - `repeating: bool` into `repeat: str | None` (a reference, not a flag) — but nothing was - ever written to populate it, and `dfnspec.md`'s promised elaboration ("See `repeat` - section below") was a dangling link, then and now. Checked what the 3 real fields with - v1 `repeating true` (`utl-tas.tas_array`, `prt-oc.times`, `prt-prp.times`) would even - reference: all 3 also have v1 `shape (any1d)`, which the mapper already collapses to - `shape=[]` (self-sizing) — matching `dfnspec.md`'s existing self-sizing-array semantics - exactly (MF6 reads values until it runs out). None has a sibling field to point to as a - count source, so the reference design never matched real data. Removed `Array.repeat` - from `schema.py`, `dfnspec.md`, and `schema.json` rather than backfilling a migration for - a field nothing consumes and no data supports. - -- Confirmed *not* a gap, for the record: worried `rtype` (OC `saverecord`/`printrecord` - arms) might not have its valid-value set migrated into `String.valid`, which would have - meant flopy4 couldn't drop its hardcoded `_OC_RTYPES` table. Checked directly — - `rtype.valid` is populated correctly per component (`['HEAD', 'BUDGET']` for gwf-oc, - etc.), sourced from the v1 DFN description text. No migration work needed here. - -- [x] **`numeric_index` → `pk`/`fk` backfill (a838d84, #337) covered fewer fields than the - v1 corpus actually has flagged.** That fix targeted 6 fields (BUY/CSUB/VSC/PRP/ATS/CXS - self-referential primary keys). A full corpus scan (walking v1 DFNs recursively including - list/record children, matched by field name against dev3's fully-recursed leaf fields — - a flat top-level-only scan finds 0, since most of these live inside `List.item.fields`, - not directly in `Block.fields`) turns up **44** fields with v1 `numeric_index: true` and - no `pk`/`fk` in dev3. Confirmed one causes a real behavioral regression, not just a - metadata gap: `gwf-lak.iconn` (connectiondata's per-lake connection sequence number) needs - the same 0-based-Python/1-based-file conversion `pk`/`fk` columns get; without it, MF6 - rejects the written file (`iconn FOR LAKE 1 MUST BE > 1 and <= 9`) — confirmed by - reproducing the failure, then fixing it with a local flopy4-side `pk = true` override, - which resolved it. flopy4 has only patched `iconn` so far (the one confirmed to break a - real test); the other 43 are unaudited case-by-case but are almost certainly the same - category — most are named like connection/vertex/cell sequence numbers scoped *within* a - parent row rather than unique across their whole table (`icell1d`/`icell2d`/`iv` - (DISU/DISV vertex indices), `icon`/`iconr`/`idv` (MAW/SFR connection numbers, siblings of - `iconn`), `cellidm1`/`cellidm2`/`cellidm`/`cellidn` (exchange cellid refs), `idcxs` - (cross-section id ref), `bndno` (SPC)) — plus `gwf-mvr.id1`/`id2`, which the flopy4-side - corpus audit (namefile-load-plan.md, Phase 0.6a) already separately concluded are - genuinely dynamic/untyped (target package resolved by name at runtime, not a formal FK) so - may not need a schema change at all, just confirmation that `index=True`-equivalent - handling is enough on the consumer side. Given the pattern (numeric_index true, not a - pk/fk match) is the same root cause already identified for the 6-field fix, this reads - like the fix's structural-signal net needs to be wider (or a distinct - "index but not a full pk" concept needs a name), not a new bug — flagging so the full 44 - get audited under the same pass rather than trickling in one flopy4 regression at a time. - Resolved by decomposing `pk`/`fk`'s conflated "needs 1-based/0-based conversion" + - "is a relational key" concerns into a dedicated `index` attribute — see - `index-node-attributes-plan.md`, Phase 1: added `Integer.index`/`Array.index` (the latter - gated to `dtype == "integer"` by a validator, and never valid on `String`), and a direct - mechanical migration (`index = numeric_index` for every `Integer`/`Array(dtype="integer")` - field) in `migrate_to_v2_0_0_dev2.py`. This is a superset of the 44-field gap: it applies - unconditionally alongside any existing `pk`/`fk`, not just where those are absent, and - fixes the confirmed `gwf-lak.iconn` regression directly (`index=True` now set on that - field). `schema.json`/`dfnspec.md` updated; full `autotest/dfns/` snapshot suite - regenerated (306 files, additive-only diff). Phase 2 (`node` attribute, replacing the - `fk="node"` sentinel) also done — see (e) below. Phase 3 (`pk`/`fk` backfill) also done — see - (b)/(d)/(f) below. All decomposed sub-issues (a)–(g) resolved; full detail in - `index-node-attributes-plan.md`. - -- [x] **Bare (valueless) boolean attribute lines in v1 DFNs migrated as `False` instead of - `True`.** v1 syntax allows a boolean attribute's line to carry no value at all (e.g. a - bare `optional` line, vs. `optional true`/`optional false`), meaning the attribute is set. - `load_dfn` parses such a line to `""` (as opposed to `None` for a wholly absent attribute), - but `try_parse_bool("", default)` unconditionally returned `False` regardless of `default`, - silently inverting the flag. Not `optional`-specific: any boolean attribute using this v1 - convention was affected (confirmed `tagged` also uses bare lines in the real corpus, 23 - occurrences across 18 files, though none happened to change rendered output this pass). - Fixed at the root in `try_parse_bool` (`modflow_devtools/misc.py`) rather than patching call - sites individually. Real-corpus impact turned out wider than originally scoped: beyond the - 6 known `*-oc`/`gwt-ist` printrecord files, `chf-dfw`, `chf-disv1d`, `gwf-npf`, `olf-dfw`, - `olf-disv1d`, `swf-dfw`, `swf-disv1d`, and `sim-nam` also had real bare-`optional` fields - that are now correctly migrated as optional. One existing test - (`test_render_respects_tagged_scalars_in_record`) had baked in the old (buggy) rendering of - `gwf-oc`'s `columns`/`width`/`digits` as required; updated to expect them bracketed as - optional, matching flopy4's independently-confirmed real MF6 behavior for the same fields. - -- Gap #2 (`numeric_index` → `pk`/`fk`, above) decomposed into concrete sub-issues after a - recursive scan against the real corpus (52 components, 98 `numeric_index: true` - occurrences). Not one bug — five different things producing the same symptom: - - [x] **(c) `_LONELY_PK_BLOCKS`/`_mark_lonely_pk` matched on the wrong name.** MF6's - convention is block `period` + list field `perioddata` (never the same string), so the - `"perioddata"` entry in the allowlist could never match *any* component — dead since - a838d84. Fixed by matching on the list field's own name instead of the enclosing block's - (`_LONELY_PK_FIELDS`, `migrate_to_v2_0_0_dev2.py`). Caught `utl-spc.bndno`. Also had to - move `_mark_lonely_pk`'s call to *after* `_fix_lak_relations`/`_fix_mvr_relations` in the - pipeline: LAK's period `number` field (the deliberately-ambiguous lake-or-outlet field — - see `_fix_lak_relations`'s docstring) structurally looks exactly like a lonely pk before - `_fix_lak_relations` splits it into per-arm `lakeno`/`outletno` fk's; marking it pk first - leaked a stale `pk=True` into those fk copies via `model_copy`. Full suite green after the - reorder, only `bndno` changed. - - [x] **(b) Same lonely-pk shape, blocked by a hardcoded name allowlist.** DISU/DISV/DISV1D's - `vertices.iv`, `cell2d.icell2d`, `cell1d.icell1d` (24 occurrences), SFR's - `diversions.iconr`/`idv`, MAW's `connectiondata.icon`, UZF's `packagedata.ivertcon` are the - same shape `_mark_lonely_pk` already detects, just under block/field names outside - `_LONELY_PK_FIELDS`. The DISU/DISV case is a deliberate exclusion in the current docstring - ("a distinct grid-geometry concern") — open question: is `pk=true` still correct/useful - there even though nothing can carry a matching `fk` back (the only things that reference - vertex/cell numbers, e.g. `icvert`, are Arrays, which can't hold `fk` at all per (a))? - Resolved (Phase 3, `index-node-attributes-plan.md`): yes, `pk=true` is still correct/useful - there — it's an honest, if unreferenced, row identifier, same as several `_LONELY_PK_FIELDS` - entries already are. `_LONELY_PK_FIELDS` widened to `vertices`/`cell2d`/`cell1d` (12 - components). The other three named here — SFR `iconr`, MAW `icon`, UZF `ivertcon` — turned - out on inspection *not* to be this shape at all (none is the record's leading field, so - `_mark_lonely_pk` structurally can't reach them regardless of allowlist); resolved instead - under (f) and via a new `_apply_fk_backfill` pass, see below. - - [x] **(d) Cross-component FKs unreachable by construction.** `idcxs`: defining side - (`chf-cxs`/`olf-cxs`/`swf-cxs`) already `pk`'d; referencing side (`chf-dfw`, `chf-cdb`, - `chf-zdg`, `olf-dfw`, `olf-zdg`, `swf-dfw`, `swf-zdg`) never gets `fk` set, because - `_resolve_relations` only ever sees one component's own `blocks` dict. Schema already - supports this (`fk = "[component.]block.field"`); migration mapper never attempts it. - Resolved (Phase 3): new `_apply_fk_backfill` pass sets - `fk = ".packagedata.idcxs"` on the 4 referencing fields that are actually Integer - list columns (`chf-cdb`, `chf-zdg`, `olf-zdg`, `swf-zdg`). Turned up a second, deeper bug - while doing this: `_validate_fk_fields` itself mishandled the 3-segment - `"component.block.field"` form (`fk.split(".")[0]` only ever took the first segment as the - block name, so it would've rejected exactly this case) — nobody had hit it before because - no `fk` had ever actually used the cross-component form. Fixed to resolve via - `spec.components`. `chf-dfw`/`olf-dfw`/`swf-dfw`'s `idcxs` is the same relation in principle - but is an `Array` (`shape=["nodes"]`) — initially left alone since `Array` couldn't carry - `fk` at all, then resolved in a follow-up pass the same day: added `Array.fk` (dtype= - "integer" only; no `pk`/`fk_ref` counterpart — an array has no rows of its own to key, and - no sibling record for a runtime component selector), which `_validate_fk_fields` already - validates for free via its `getattr`-based field walk. Backfilled via a new - `_apply_array_fk_backfill` pass (`_ARRAY_FK_BACKFILL` allowlist) on all 3 `*-dfw` - components. MAW's `connectiondata.icon` (below, under (f)) reconfirmed as permanently out - of scope in the same pass — not a parallel gap, just double-checked. - - [x] **(e) `fk = "node"` grid-cell sentinel, unused.** `exg-*.cellidm1`/`cellidm2` (6 - exchange types), `gwf-gnc.cellidm`/`cellidn` look like the schema's existing grid-cell - sentinel case, already speced and validated in `schema.py`, never populated by the mapper. - Resolved by replacing the sentinel entirely with a dedicated `Integer.node` attribute - (Phase 2, `index-node-attributes-plan.md`): confirmed the actual corpus count is 5 - exchange components (`exg-chfgwf`/`exg-gwegwe`/`exg-gwfgwf`/`exg-gwtgwt`/`exg-olfgwf`, each - with `exchangedata.cellidm1`/`cellidm2`) plus `gwf-gnc.gncdata.cellidm`/`cellidn` — 6 fields - total across those, not "6 exchange types" as the original note implied. Backfilled by a - new `_mark_node_refs` pass keyed on an explicit `_NODE_REF_FIELDS` allowlist (audited, not - derived — v1 has no attribute this maps from). `fk = "node"` itself is no longer a special - sentinel: `_validate_fk_fields` dropped its exemption, so an unqualified `fk = "node"` now - just has to resolve to an actual list block like any other bare fk value (in practice - meaning nobody sets it — the deprecation is structural, not a hard reject). - - [x] **(a) Array-typed fields can't take `pk`/`fk` at all.** `irch`, `ievt`, `icvert`, `ja`, - `ic`, `cellidsj` are `Array`s; `dfnspec.md` restricts `pk`/`fk` to integer/string columns - in a list item record. v1's `numeric_index` on these likely just means "apply 1-based - conversion," a concept with no home in v2 outside the relational `pk`/`fk` vocabulary. - Resolved: `numeric_index` never meant relational identity here, so it doesn't need - `pk`/`fk` — it needed `Array.index` (Phase 1, `index-node-attributes-plan.md`), now - migrated directly for every `Array(dtype="integer")` field. - - [x] **(f) Compound keys — no concept for them.** SFR's `diversions.iconr`/`idv` are unique - only per-reach, not table-wide; a blind `pk=true` would misrepresent them. `pk`/`fk` as - specced has no compound-key notion. Resolved (Phase 3): no new concept needed once `pk`/`fk` - aren't asked to double as the serialization signal — `idv` correctly gets `index` only (from - Phase 1, mechanically; it was never a valid `pk`, compound-scoped or not). `iconr` isn't - compound-scoped at all on inspection — its description ("the downstream reach that will - receive the diverted water") makes it a real, globally-scoped reference into - `packagedata.ifno` (reach numbers), so it gets `fk = "packagedata.ifno"` via - `_apply_fk_backfill`, same as any other single-column fk. UZF's `packagedata.ivertcon` - (self-referential: a UZF cell may point to another UZF cell below it) turned out to be the - same single-column-fk shape and got the same treatment. MAW's `connectiondata.icon` is the - one genuine compound-scoped case with no real target (same shape as `gwf-lak.iconn`) — - correctly left with `index` only, nothing more to add. - - [x] **(g) `gwf-mvr.id1`/`id2`, `utl-obs.id`/`id2`** — already independently audited - (dynamic/name-resolved, not a formal FK). Confirmed by this scan too; no work needed. From 7dbaa4ba7216acfcadc138a7697483f2be5b6bd7 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Aug 2026 18:21:19 -0400 Subject: [PATCH 10/11] refactor(dfns): move try_parse_bool into dfns migration module, trim schema.py comments try_parse_bool is only used by the v2 dfn migration code, so move it out of the generic misc module and into migrate_to_v2_0_0_dev2 (dev3 already imports from that module). Also drop docstrings/comments on private schema.py helpers that mostly restated the code, and rename _can_share_model to _receives_from with requester/provider-named params to make the direction of the model-scope dim-visibility check explicit. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01PCFraGPS9DuhabpEnreYUy --- .../dfns/migrate_to_v2_0_0_dev2.py | 24 +++- .../dfns/migrate_to_v2_0_0_dev3.py | 3 +- modflow_devtools/dfns/schema.py | 110 ++++-------------- modflow_devtools/misc.py | 20 ---- 4 files changed, 46 insertions(+), 111 deletions(-) diff --git a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py index d1925134..f3633170 100644 --- a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py +++ b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py @@ -7,12 +7,34 @@ from modflow_devtools.dfn import schema as v1 from modflow_devtools.dfns import schema as v2 -from modflow_devtools.misc import try_literal_eval, try_parse_bool +from modflow_devtools.misc import try_literal_eval _IDENT_RE = re.compile(r"^[A-Za-z_]\w*$") _LOOKUP_RE = re.compile(r"^(\w+)\.(\w+)\((\w+)\)$") _COL_FK_RE = re.compile(r"^([A-Za-z_]\w*)\(([A-Za-z_]\w*)\)$") + +def try_parse_bool(v: Any, default: bool = False) -> bool: + """ + Try to parse a boolean from a string. + + An empty string is treated as ``True`` rather than ``False``: DFN files + allow a bare attribute line with no value (e.g. ``optional`` on its own + line, as opposed to ``optional true``/``optional false``) to mean the + attribute is set. ``load_dfn`` parses such a line to an empty string, as + distinct from ``None``, which indicates the attribute wasn't present at + all (and falls through to ``default``). + """ + if isinstance(v, bool): + return v + if isinstance(v, str): + s = v.strip().lower() + if s in ("true", ""): + return True + if s == "false": + return False + return default + _DEPENDENT_VARS: dict[str, str] = { "gwf": "head", "gwt": "concentration", diff --git a/modflow_devtools/dfns/migrate_to_v2_0_0_dev3.py b/modflow_devtools/dfns/migrate_to_v2_0_0_dev3.py index 999232d3..20d02b3c 100644 --- a/modflow_devtools/dfns/migrate_to_v2_0_0_dev3.py +++ b/modflow_devtools/dfns/migrate_to_v2_0_0_dev3.py @@ -25,8 +25,7 @@ from boltons.dictutils import OMD from modflow_devtools.dfns import schema as v2 -from modflow_devtools.dfns.migrate_to_v2_0_0_dev2 import to_v2_0_0_dev2 -from modflow_devtools.misc import try_parse_bool +from modflow_devtools.dfns.migrate_to_v2_0_0_dev2 import to_v2_0_0_dev2, try_parse_bool # --------------------------------------------------------------------------- # dtype translation diff --git a/modflow_devtools/dfns/schema.py b/modflow_devtools/dfns/schema.py index 5f149a14..b37c2bf2 100644 --- a/modflow_devtools/dfns/schema.py +++ b/modflow_devtools/dfns/schema.py @@ -93,16 +93,10 @@ class Integer(FieldBase): type: Literal["integer"] = PydanticField(default="integer", frozen=True) valid: list[int] | None = None time_series: bool = False - # Pure serialization fact: does this value need MF6's 1-based (file) <-> - # 0-based (Python) translation on read/write? Orthogonal to pk/fk, which - # are about relational identity, not serialization. See docs/md/dfnspec.md. index: bool = False pk: bool = False fk: str | None = None fk_ref: str | None = None - # Grid-cell reference, resolved from the parent model's grid (DIS/DISV/DISU) - # at runtime — a structurally different resolution path than fk (geometry - # lookup, not a pk lookup in another list). See docs/md/dfnspec.md. node: bool = False @@ -113,8 +107,6 @@ class Double(FieldBase): class File(FieldBase): type: Literal["file"] = PydanticField(default="file", frozen=True) - # Whether MF6 reads ("in") or writes ("out") the file. Independent of any - # particular serialization's keyword vocabulary (v1 text uses FILEIN/FILEOUT). direction: Literal["in", "out"] @@ -130,17 +122,7 @@ class Array(FieldBase): shape: list[str] = [] time_series: bool = False layered: bool = False - # Whether the array's elements are 1-based indices needing MF6's - # 1-based (file) <-> 0-based (Python) translation. Only meaningful when - # dtype == "integer"; see docs/md/dfnspec.md. index: bool = False - # Foreign key: nonzero elements reference a row (by pk) in another list, - # per-grid-cell rather than per-list-row (e.g. a per-cell cross-section - # id). Only meaningful when dtype == "integer". Hierarchical path form - # only ("[component.]block.field") — no `pk` or `fk_ref` counterpart, since - # an array has no rows of its own to be a key of, and there's no sibling - # String field to carry a runtime component reference. See dfnspec.md, - # "Primary and foreign keys". fk: str | None = None @model_validator(mode="after") @@ -200,7 +182,6 @@ def _check_shape_length(self) -> "List": @property def children(self) -> "dict[str, Field]": - # item.name duplicates the List's own name, so it's not a useful key here. return self.item.children @@ -218,7 +199,6 @@ def children(self) -> "dict[str, Field]": def _collect_fields( fields: "dict[str, Field]", items: "list[tuple[str, Field]]", *, recurse: bool ) -> None: - """Append `fields` to `items`, descending into Record/Union/List children if `recurse`.""" for name, field in fields.items(): items.append((name, field)) if recurse and isinstance(field, (Record, Union, List)): @@ -237,23 +217,14 @@ def _render_file(field: "File") -> str: def _tag(field: "Field", inner: str) -> str: - """Prefix `inner` with the field's uppercased name if it's tagged.""" return f"{field.name.upper()} {inner}" if field.tagged else inner def _ts_token(token: str, *, time_series: bool) -> str: - """Wrap a bare `` in `@...@` time-series markers if flagged.""" return f"<@{token}@>" if time_series else f"<{token}>" def _render_rows(item: "Record | Union") -> list[str]: - """Return one or more rendered row strings for a List item. - - A Union whose arms are all Records produces one row per arm (each wrapped - in [...] since arms are mutually exclusive alternatives). A Union whose - arms are scalars/keywords collapses to a single placeholder — listing - every option inline would be noise. - """ if isinstance(item, Record): return [" ".join(_render_field(f, inline=True) for f in item.fields.values())] if all(isinstance(arm, Record) for arm in item.arms.values()): @@ -266,14 +237,6 @@ def _render_rows(item: "Record | Union") -> list[str]: def _render_field(field: "Field", *, inline: bool = False) -> str: - """Render a field's own text, relative to its own first line (no block indent). - - Backs ``FieldBase.render()`` — see that docstring for the ``inline`` - semantics. Kept as a free function (rather than inlined per-subclass) - so ``Record``/``Union``/``List`` can recurse over arbitrary child field - types via a single ``match``. - """ - def _wrap(token: str) -> str: return f"[{token}]" if field.optional else token @@ -322,30 +285,21 @@ def _wrap(token: str) -> str: return f"{rows[0]}\n{rows[0]}\n..." -def _field_is_current(field: "Field", *, developmode: bool) -> bool: - """Whether a field belongs in render() output. - - Removed/deprecated fields are never current syntax, so they're always - excluded (MF6 no longer parses a removed field at all, and a deprecated one - is discouraged even where still accepted) — there's no flag to see them in - render() output, matching mf6io.pdf. Fields flagged `Field.developmode` - (which subsumes v1's `dev_`-name convention; see `_map_field` in the - migration) are internal/undocumented and excluded by default, but callers - doing internal tooling can opt in via the `developmode` parameter. - """ +def _should_render(field: "Field", *, developmode: bool) -> bool: + # always omit removed/deprecated fields if field.removed is not None or field.deprecated is not None: return False + # optionally omit developmode fields return developmode or not field.developmode def _render_block(block: "Block", indent: str = " ", *, developmode: bool = False) -> str: - """Render a Block as a BEGIN/END template string.""" begin = f"BEGIN {block.name.upper()}" if block.header is not None: begin = f"{begin} {block.header.render(inline=True)}" lines = [begin] for field in block.fields.values(): - if not _field_is_current(field, developmode=developmode): + if not _should_render(field, developmode=developmode): continue lines.extend(f"{indent}{line}" for line in field.render().split("\n")) lines.append(f"END {block.name.upper()}") @@ -353,12 +307,6 @@ def _render_block(block: "Block", indent: str = " ", *, developmode: bool = Fal def _names_in_expr(expr: str) -> set[str]: - """Return dim-reference Name identifiers from expr. - - Excluded from the result: - - Names in function-call position (never a dim ref, e.g. ``abs``, ``math``) - - Arguments of ``sum()`` and ``len()`` calls (domain-specific, handled separately) - """ try: tree = ast.parse(expr, mode="eval") except SyntaxError as e: @@ -384,7 +332,6 @@ def _names_in_expr(expr: str) -> set[str]: def _validate_sum_call(call: ast.Call, component: "ComponentBase", expr: str) -> None: - """Validate a sum(list.col) or sum(block.list.col) call in a derived_dims expression.""" if len(call.args) != 1: raise ValueError(f"sum() in derived_dims must have exactly one argument in {expr!r}") arg = call.args[0] @@ -432,7 +379,6 @@ def _validate_sum_call(call: ast.Call, component: "ComponentBase", expr: str) -> def _validate_len_call(call: ast.Call, component: "ComponentBase", expr: str) -> None: - """Validate a len(field_name) call in a dims value expression.""" if len(call.args) != 1: raise ValueError(f"len() in dims must have exactly one argument in {expr!r}") if not isinstance(call.args[0], ast.Name): @@ -445,18 +391,18 @@ def _validate_len_call(call: ast.Call, component: "ComponentBase", expr: str) -> class Dim(BaseModel): """A named dimension backed by a field reference or derived from an expression. - ``value`` is a Python expression string: - - bare identifier ``nlay`` → integer field reference - - ``len(auxiliary)`` → self-sizing array field reference - - anything else, e.g. ``nlay * ncol`` → derived arithmetic expression + ``value`` specifies the dimension size, directly or indirectly, and can be: + - ``nlay``: an integer field + - ``len(auxiliary)``: the runtime length of a self-sizing array field + - ``nlay * ncol``: the result of an arithmetic expression, e.g. of other dims If ``value`` is None, the dimension is runtime-only: its value cannot be derived from DFN input fields. ``set_in`` then indicates the simulation hook - in which the value is first established by MODFLOW (e.g. ``"ar"`` for dims + in which the value is first set by MODFLOW (e.g. ``"ar"`` for dims that are set during grid allocation, ``"rp"`` for dims reset each stress period). - Runtime dims are valid in memory variable shapes but not in input field shapes, - since a sequential parser must know an array's size before reading it. + Runtime dims may appear in memory variable shape expressions but not in input + field shapes expressions. """ value: str | None = None @@ -470,26 +416,17 @@ def _parents_as_set(parent: "str | list[str] | None") -> set[str]: return {parent} if isinstance(parent, str) else set(parent) -def _can_share_model( - req_parent: "str | list[str] | None", - dim_parent: "str | list[str] | None", +def _receives_from( + requester_parent: "str | list[str] | None", + provider_parent: "str | list[str] | None", ) -> bool: - """ - Return True if the requesting component (req_parent) can be in the same - model as the dim-defining component (dim_parent). - - The dim-provider's parent identifies which model it belongs to (a concrete - ``-nam`` name, e.g. ``"gwf-nam"``). The requesting component's parent - determines whether it can be in that model: an explicit match, or a generic - type like ``"model"`` or ``"package"`` meaning any model. - """ - dim_parents = _parents_as_set(dim_parent) - model_contexts = {p for p in dim_parents if p.endswith("-nam") and p != "sim-nam"} + provider_parents = _parents_as_set(provider_parent) + model_contexts = {p for p in provider_parents if p.endswith("-nam") and p != "sim-nam"} if not model_contexts: return False - req_parents = _parents_as_set(req_parent) - for rp in req_parents: + requester_parents = _parents_as_set(requester_parent) + for rp in requester_parents: if rp in ("model", "package", "*"): return True if rp in model_contexts: @@ -500,10 +437,7 @@ def _can_share_model( def _resolve_derived_dims(component: "ComponentBase", known_dims: set[str]) -> list[str]: """ Validate all dim value expressions and return dim names in topological order. - Raises ValueError on cycles, unresolvable operands, or invalid field references. - - ``known_dims`` is the full set of dim names visible to this component; - pass ``spec.dims(name)`` or an explicit set in tests. + Raise ValueError on cycles, unresolvable operands, or invalid field references. """ all_dims = component.dims or {} if not all_dims: @@ -731,7 +665,7 @@ class Model(ComponentBase): class Package(ComponentBase): type: Literal["package"] = "package" - multi: bool = False # whether multiple instances per parent are allowed + multi: bool = False subtype: Literal["solution", "exchange", "stress", "advanced", "utility"] | None = None @@ -1285,7 +1219,7 @@ def inherited_dims(self, component_name: str) -> set[str]: case "simulation": inherited.add(dim_name) case "model": - if _can_share_model(req_parent, c.parent): + if _receives_from(req_parent, c.parent): inherited.add(dim_name) case "component": if cname in _parents_as_set(req_parent): @@ -1318,7 +1252,7 @@ def input_dims(self, component_name: str) -> set[str]: case "simulation": inherited.add(dim_name) case "model": - if _can_share_model(req_parent, c.parent): + if _receives_from(req_parent, c.parent): inherited.add(dim_name) case "component": if cname in _parents_as_set(req_parent): diff --git a/modflow_devtools/misc.py b/modflow_devtools/misc.py index a1cc1573..b77b5715 100644 --- a/modflow_devtools/misc.py +++ b/modflow_devtools/misc.py @@ -579,23 +579,3 @@ def try_literal_eval(value: str) -> Any: return value -def try_parse_bool(v: Any, default: bool = False) -> bool: - """ - Try to parse a boolean from a string. - - An empty string is treated as ``True`` rather than ``False``: DFN files - allow a bare attribute line with no value (e.g. ``optional`` on its own - line, as opposed to ``optional true``/``optional false``) to mean the - attribute is set. ``load_dfn`` parses such a line to an empty string, as - distinct from ``None``, which indicates the attribute wasn't present at - all (and falls through to ``default``). - """ - if isinstance(v, bool): - return v - if isinstance(v, str): - s = v.strip().lower() - if s in ("true", ""): - return True - if s == "false": - return False - return default From 0abc251a29387f642cbb7164a8ff6c83dda71a66 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Thu, 20 Aug 2026 18:41:19 -0400 Subject: [PATCH 11/11] ruff --- autotest/dfns/test_schema.py | 4 +++- docs/md/dfnspec.md | 2 +- modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py | 1 + modflow_devtools/misc.py | 2 -- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/autotest/dfns/test_schema.py b/autotest/dfns/test_schema.py index d361adb2..13cd6179 100644 --- a/autotest/dfns/test_schema.py +++ b/autotest/dfns/test_schema.py @@ -345,7 +345,9 @@ def test_render_respects_tagged_scalars_in_record(dev3_spec): render = dev3_spec.components["gwf-oc"].blocks["options"].render() # columns/width/digits are optional per v1's bare `optional` attribute on each # (see try_parse_bool's empty-string handling), so they render bracketed. - assert "HEAD PRINT_FORMAT [COLUMNS ] [WIDTH ] [DIGITS ] " in render + assert ( + "HEAD PRINT_FORMAT [COLUMNS ] [WIDTH ] [DIGITS ] " in render + ) def test_render_respects_untagged_arrays_in_record(dev3_spec): diff --git a/docs/md/dfnspec.md b/docs/md/dfnspec.md index 06506e8c..bf547ab4 100644 --- a/docs/md/dfnspec.md +++ b/docs/md/dfnspec.md @@ -396,7 +396,7 @@ Type `integer`. ###### `node` -`boolean (default: false)`. Marks this scalar as a grid cell reference, resolved from the parent model's grid (DIS/DISV/DISU) at runtime. Valid only on integer scalars that are columns in a list item record — the same placement `fk` requires. A structurally distinct resolution path from `fk`: a grid-cell lookup against model geometry, not a `pk` lookup in another list. +`boolean (default: false)`. Marks this scalar as a grid cell reference, resolved from the parent model's grid (DIS/DISV/DISU) at runtime. Valid only on integer scalars that are columns in a list item record. #### Double diff --git a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py index f3633170..0638d73b 100644 --- a/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py +++ b/modflow_devtools/dfns/migrate_to_v2_0_0_dev2.py @@ -35,6 +35,7 @@ def try_parse_bool(v: Any, default: bool = False) -> bool: return False return default + _DEPENDENT_VARS: dict[str, str] = { "gwf": "head", "gwt": "concentration", diff --git a/modflow_devtools/misc.py b/modflow_devtools/misc.py index b77b5715..3df65c25 100644 --- a/modflow_devtools/misc.py +++ b/modflow_devtools/misc.py @@ -577,5 +577,3 @@ def try_literal_eval(value: str) -> Any: return literal_eval(value) except (SyntaxError, ValueError): return value - -