From 2c0fd8b2bd8b764f0b68d4c489d19a2a8e280d90 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Wed, 11 Nov 2026 05:24:53 -0800 Subject: [PATCH] fix(dfns): pin MF6 DFNs with corrected PRINT_FORMAT records MODFLOW-ORG/modflow6#3129 fixed formatrecord's optional flags in the DFNs: columns, width and digits are required, and format is optional. MF6 now also rejects a partial record like COLUMNS 2 WIDTH 16, which it used to run and ignore. * pin the MF6 DFNs to 65278c93, the merge commit. Since 6.8.2 the only DFN changes are these six records, in chf-oc, gwe-oc, gwf-oc, gwt-oc, olf-oc and gwt-ist * regenerate the dev2 and dev3 snapshots, where only the optional flags change * test the flags after migration, and the rendered syntax * say in the spec that LAK and MAW observation connection keys are stricter than MF6 Co-Authored-By: Claude Opus 5.5 --- .github/workflows/ci.yml | 2 +- .../__snapshots__/v2.0.0.dev2/chf-oc.json | 10 +++---- .../__snapshots__/v2.0.0.dev2/chf-oc.toml | 4 +-- .../__snapshots__/v2.0.0.dev2/chf-oc.yaml | 4 +-- .../__snapshots__/v2.0.0.dev2/gwe-oc.json | 10 +++---- .../__snapshots__/v2.0.0.dev2/gwe-oc.toml | 4 +-- .../__snapshots__/v2.0.0.dev2/gwe-oc.yaml | 4 +-- .../__snapshots__/v2.0.0.dev2/gwf-oc.json | 10 +++---- .../__snapshots__/v2.0.0.dev2/gwf-oc.toml | 4 +-- .../__snapshots__/v2.0.0.dev2/gwf-oc.yaml | 4 +-- .../__snapshots__/v2.0.0.dev2/gwt-ist.json | 10 +++---- .../__snapshots__/v2.0.0.dev2/gwt-ist.toml | 4 +-- .../__snapshots__/v2.0.0.dev2/gwt-ist.yaml | 4 +-- .../__snapshots__/v2.0.0.dev2/gwt-oc.json | 10 +++---- .../__snapshots__/v2.0.0.dev2/gwt-oc.toml | 4 +-- .../__snapshots__/v2.0.0.dev2/gwt-oc.yaml | 4 +-- .../__snapshots__/v2.0.0.dev2/olf-oc.json | 10 +++---- .../__snapshots__/v2.0.0.dev2/olf-oc.toml | 4 +-- .../__snapshots__/v2.0.0.dev2/olf-oc.yaml | 4 +-- .../__snapshots__/v2.0.0.dev3/chf-oc.json | 10 +++---- .../__snapshots__/v2.0.0.dev3/chf-oc.toml | 4 +-- .../__snapshots__/v2.0.0.dev3/chf-oc.yaml | 4 +-- .../__snapshots__/v2.0.0.dev3/gwe-oc.json | 10 +++---- .../__snapshots__/v2.0.0.dev3/gwe-oc.toml | 4 +-- .../__snapshots__/v2.0.0.dev3/gwe-oc.yaml | 4 +-- .../__snapshots__/v2.0.0.dev3/gwf-oc.json | 10 +++---- .../__snapshots__/v2.0.0.dev3/gwf-oc.toml | 4 +-- .../__snapshots__/v2.0.0.dev3/gwf-oc.yaml | 4 +-- .../__snapshots__/v2.0.0.dev3/gwt-ist.json | 10 +++---- .../__snapshots__/v2.0.0.dev3/gwt-ist.toml | 4 +-- .../__snapshots__/v2.0.0.dev3/gwt-ist.yaml | 4 +-- .../__snapshots__/v2.0.0.dev3/gwt-oc.json | 10 +++---- .../__snapshots__/v2.0.0.dev3/gwt-oc.toml | 4 +-- .../__snapshots__/v2.0.0.dev3/gwt-oc.yaml | 4 +-- .../__snapshots__/v2.0.0.dev3/olf-oc.json | 10 +++---- .../__snapshots__/v2.0.0.dev3/olf-oc.toml | 4 +-- .../__snapshots__/v2.0.0.dev3/olf-oc.yaml | 4 +-- autotest/dfns/conftest.py | 2 +- autotest/dfns/test_migrate.py | 26 ++++++++++++++++++- autotest/dfns/test_schema.py | 6 +---- docs/md/dfnspec.md | 2 ++ 41 files changed, 102 insertions(+), 152 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 92bf6736..76cce734 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -106,7 +106,7 @@ jobs: uses: actions/checkout@v4 with: repository: MODFLOW-ORG/modflow6 - ref: "6.8.2" + ref: "65278c938a0c6e742b52fa7398b35a9aea6c0752" path: modflow6 - name: Setup uv 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 59ffbc23..6c9f4ad4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.json @@ -99,25 +99,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 0e3992c7..ba936995 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.toml @@ -89,24 +89,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.period.fields.stress_period_data] 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 0a2bb251..2b527486 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/chf-oc.yaml @@ -86,21 +86,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false period: fields: 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 6ba95383..6c8ba6db 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.json @@ -81,25 +81,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 e67cf256..fe18bc0e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.toml @@ -73,24 +73,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.period.fields.stress_period_data] 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 39cfb362..a0934624 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwe-oc.yaml @@ -72,21 +72,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false period: fields: 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 19885481..9cc99be4 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.json @@ -81,25 +81,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 eace2232..306b8259 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.toml @@ -73,24 +73,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.period.fields.stress_period_data] 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 21250b26..cd22e614 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwf-oc.yaml @@ -72,21 +72,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false period: fields: 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 37b0ad42..309f23c5 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.json @@ -111,25 +111,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 f86a1321..f6dfad54 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.toml @@ -103,24 +103,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.options.fields.sorbate_filerecord] 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 ae92dd58..b1ba7089 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-ist.yaml @@ -104,21 +104,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false sorbate_filerecord: type: record 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 921f9e19..d7cac0f3 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.json @@ -81,25 +81,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 49eb8afc..515f37ea 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.toml @@ -73,24 +73,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.period.fields.stress_period_data] 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 dbdc84b5..118bd9cd 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/gwt-oc.yaml @@ -72,21 +72,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false period: fields: 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 57d26789..00f1a0bb 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.json @@ -99,25 +99,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 d337687f..c7b621ca 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.toml @@ -89,24 +89,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.period.fields.stress_period_data] 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 6ef26622..c3a85dba 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev2/olf-oc.yaml @@ -86,21 +86,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false period: fields: 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 f56db297..89a088fd 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.json @@ -99,25 +99,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 f3926cd2..94e9f982 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.toml @@ -89,24 +89,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.period.fields.stress_period_data] 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 75fd8e6f..9290a136 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/chf-oc.yaml @@ -86,21 +86,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false period: fields: 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 d9f60e2e..909d6f84 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.json @@ -81,25 +81,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 accbc662..aabc6ae6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.toml @@ -73,24 +73,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.period.fields.stress_period_data] 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 804a014d..02d290a1 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwe-oc.yaml @@ -72,21 +72,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false period: fields: 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 356cf7f3..4a150d2b 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.json @@ -81,25 +81,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 244f63d4..98c42ccc 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.toml @@ -73,24 +73,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.period.fields.stress_period_data] 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 2ddcfbb8..df1a7990 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwf-oc.yaml @@ -72,21 +72,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false period: fields: 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 ac90b123..b5b5fb25 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.json @@ -116,25 +116,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 1ff5c943..f9969b00 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.toml @@ -106,24 +106,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.options.fields.sorbate_filerecord] 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 bd2e49b1..a0a3fb56 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-ist.yaml @@ -107,21 +107,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false sorbate_filerecord: type: record 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 bc3221b5..70fd1b7e 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.json @@ -81,25 +81,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 ae02a74d..8007ca1a 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.toml @@ -73,24 +73,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.period.fields.stress_period_data] 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 4a0cc8a9..9111e718 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/gwt-oc.yaml @@ -72,21 +72,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false period: fields: 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 d461a571..bc6aa060 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.json +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.json @@ -99,25 +99,23 @@ "columns": { "type": "integer", "longname": "number of columns", - "description": "number of columns for writing data.", - "optional": true + "description": "number of columns for writing data." }, "width": { "type": "integer", "longname": "width for each number", - "description": "width for writing each number.", - "optional": true + "description": "width for writing each number." }, "digits": { "type": "integer", "longname": "number of digits", - "description": "number of digits to use for writing a number.", - "optional": true + "description": "number of digits to use for writing a number." }, "format": { "type": "string", "longname": "write format", "description": "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC.", + "optional": true, "tagged": false } } 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 0e92b6b8..95acd5a6 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.toml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.toml @@ -89,24 +89,22 @@ 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" longname = "write format" description = "write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC." +optional = true tagged = false [blocks.period.fields.stress_period_data] 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 268581d4..5cbe7cac 100644 --- a/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.yaml +++ b/autotest/dfns/__snapshots__/v2.0.0.dev3/olf-oc.yaml @@ -86,21 +86,19 @@ 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 description: write format can be EXPONENTIAL, FIXED, GENERAL, or SCIENTIFIC. + optional: true tagged: false period: fields: diff --git a/autotest/dfns/conftest.py b/autotest/dfns/conftest.py index 8524bc91..f2a14e8f 100644 --- a/autotest/dfns/conftest.py +++ b/autotest/dfns/conftest.py @@ -62,7 +62,7 @@ def snapshot(snapshot): DFNS_REPO = os.getenv("TEST_DFNS_REPO", "MODFLOW-ORG/modflow6") -DFNS_REF = os.getenv("TEST_DFNS_REF", "6.8.2") +DFNS_REF = os.getenv("TEST_DFNS_REF", "65278c938a0c6e742b52fa7398b35a9aea6c0752") @pytest.fixture(scope="module") diff --git a/autotest/dfns/test_migrate.py b/autotest/dfns/test_migrate.py index 87f27e34..195a1f61 100644 --- a/autotest/dfns/test_migrate.py +++ b/autotest/dfns/test_migrate.py @@ -24,7 +24,7 @@ FORMATS = ["yaml", "toml", "json"] MF6_OWNER = "MODFLOW-ORG" MF6_REPO = "modflow6" -MF6_REF = "6.8.2" +MF6_REF = "65278c938a0c6e742b52fa7398b35a9aea6c0752" def _load(path: Path, fmt: str) -> dict: @@ -701,6 +701,30 @@ def test_migrate_obs_id_boundname_arm_has_no_when(dfn_dir): assert item.fields["id"].arms["boundname"].when is None +@pytest.mark.parametrize( + "name,record", + [ + ("chf-oc", "qoutflowprintrecord"), + ("gwe-oc", "temperatureprintrecord"), + ("gwf-oc", "headprintrecord"), + ("gwt-ist", "cimprintrecord"), + ("gwt-oc", "concentrationprintrecord"), + ("olf-oc", "qoutflowprintrecord"), + ], +) +def test_migrate_format_record_optional(dfn_dir, name, record): + # MF6 uses a format only with COLUMNS, WIDTH and DIGITS, and has a default + # edit descriptor. + options = _migrate_dev3(dfn_dir, name).blocks["options"] + fields = options.fields[record].fields["formatrecord"].fields + assert {n: f.optional for n, f in fields.items()} == { + "columns": False, + "width": False, + "digits": False, + "format": True, + } + + def test_migrate_option_columns_fails_when_stale(dfn_dir, monkeypatch): from modflow_devtools.dfns import migrate_to_v2_0_0_dev2 as dev2 diff --git a/autotest/dfns/test_schema.py b/autotest/dfns/test_schema.py index b65fcfcf..b95db3fb 100644 --- a/autotest/dfns/test_schema.py +++ b/autotest/dfns/test_schema.py @@ -716,11 +716,7 @@ def test_obs_filerecord_stays_a_record(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() - # 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 9bc94909..2577245c 100644 --- a/docs/md/dfnspec.md +++ b/docs/md/dfnspec.md @@ -942,6 +942,8 @@ fk = { path = "diversions.idv", scope = "ifno" } Likewise `gwf-lak`'s `connectiondata.iconn` and `gwf-maw`'s `connectiondata.icon` are scoped by `ifno`. MAW's `angledata.icon` and the LAK and MAW observations' connection numbers reference them, with the same scope. +The observations' keys are deliberately stricter than MODFLOW 6, which doesn't check a connection number against the feature. It counts from the feature's first connection across the package (`lak_rp_obs`, `maw_rp_obs`), so `lak 1 58` on a lake with 57 connections runs, and observes the next lake's first connection. What the key rejects is almost certainly a mistake reported as another feature's value. + #### Key sets A normal `fk` is written as a path because the referrer knows the target's type: `gwf-mvr`'s `pname1` always names a row of its own `packages`. When the referenced instance is picked at runtime and may be one of several component types, the referrer can't write a path. Instead, it names a **role**, and each component type that can play it says what it means, like an interface or protocol. A component declares its roles in [`keys`](#keys):