Skip to content

Commit 07b7795

Browse files
wpbonelliwpbonelli
authored andcommitted
plumbing works. need to fix period block grammar rules, right now it's array-style as in v2/toml. should rather generate grammars from v1 dfns.
1 parent 6d3b6c8 commit 07b7795

File tree

161 files changed

+3448
-19
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

161 files changed

+3448
-19
lines changed

flopy4/mf6/codec/reader/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from typing import IO, Any
22

3-
from flopy4.mf6.codec.reader.parser import make_basic_parser
3+
from flopy4.mf6.codec.reader.parser import get_basic_parser
44
from flopy4.mf6.codec.reader.transformer import BasicTransformer
55

6-
BASIC_PARSER = make_basic_parser()
6+
BASIC_PARSER = get_basic_parser()
77
BASIC_TRANSFORMER = BasicTransformer()
88

99

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""Convert (TOML/v2) DFNs to Lark grammars."""
2+
3+
import argparse
4+
from os import PathLike
5+
from pathlib import Path
6+
7+
from modflow_devtools.dfn import Dfn
8+
9+
from flopy4.mf6.codec.reader.grammar import make_all_grammars
10+
11+
_GRAMMAR_MODULE = Path(__file__).parent / "grammar"
12+
_GRAMMAR_GEN_DIR = _GRAMMAR_MODULE / "generated"
13+
14+
15+
def generate(dfndir: PathLike, outdir: PathLike):
16+
"""Generate lark grammars from DFNs."""
17+
dfndir = Path(dfndir).expanduser().absolute()
18+
outdir = Path(outdir).expanduser().absolute()
19+
outdir.mkdir(exist_ok=True, parents=True)
20+
dfns = Dfn.load_all(dfndir, version=2)
21+
make_all_grammars(dfns, outdir)
22+
23+
24+
if __name__ == "__main__":
25+
parser = argparse.ArgumentParser(description="Generate lark grammars from DFNs.")
26+
parser.add_argument(
27+
"--dfndir",
28+
"-d",
29+
type=str,
30+
help="Directory containing DFN files.",
31+
)
32+
parser.add_argument(
33+
"--outdir",
34+
"-o",
35+
help="Output directory.",
36+
default=_GRAMMAR_GEN_DIR,
37+
)
38+
args = parser.parse_args()
39+
generate(args.dfndir, args.outdir)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from os import PathLike
2+
from pathlib import Path
3+
4+
import jinja2
5+
from modflow_devtools.dfn import Dfn, get_blocks, get_fields
6+
7+
from flopy4.mf6.codec.reader.grammar.filters import field_type
8+
9+
10+
def _get_template_env():
11+
loader = jinja2.PackageLoader("flopy4", "mf6/codec/reader/grammar/templates/")
12+
env = jinja2.Environment(
13+
loader=loader,
14+
trim_blocks=True,
15+
lstrip_blocks=True,
16+
keep_trailing_newline=True,
17+
)
18+
env.filters["field_type"] = field_type
19+
return env
20+
21+
22+
def make_grammar(dfn: Dfn, outdir: PathLike):
23+
"""Generate a Lark grammar file for a single component."""
24+
outdir = Path(outdir).expanduser().resolve().absolute()
25+
env = _get_template_env()
26+
template = env.get_template("component.lark.jinja")
27+
target_path = outdir / f"{dfn['name']}.lark"
28+
with open(target_path, "w") as f:
29+
name = dfn["name"]
30+
blocks = get_blocks(dfn)
31+
fields = get_fields(dfn)
32+
f.write(template.render(name=name, blocks=blocks, fields=fields))
33+
34+
35+
def make_all_grammars(dfns: dict[str, Dfn], outdir: PathLike):
36+
"""Generate grammars for all components."""
37+
outdir = Path(outdir).expanduser().resolve().absolute()
38+
outdir.mkdir(parents=True, exist_ok=True)
39+
for dfn in dfns.values():
40+
make_grammar(dfn, outdir)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from modflow_devtools.dfn import Field
2+
3+
4+
def field_type(field: Field) -> str:
5+
match field["type"]:
6+
case t if t in ["string", "integer", "double precision"] and "shape" in field:
7+
if "period" in field["block"]:
8+
return "list"
9+
return "array"
10+
case "keyword":
11+
return ""
12+
case "keystring":
13+
return "record"
14+
case _:
15+
return field["type"]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Auto-generated grammar for MF6 CHF-CDB
2+
%import "typed.lark"
3+
4+
start: block*
5+
block: options_block | dimensions_block | period_block
6+
options_block: "begin"i "options"i options_fields "end"i "options"i
7+
dimensions_block: "begin"i "dimensions"i dimensions_fields "end"i "dimensions"i
8+
period_block: "begin"i "period"i period_fields "end"i "period"i
9+
options_fields: (auxiliary | boundnames | print_input | print_flows | save_flows | obs_filerecord)*
10+
dimensions_fields: (maxbound)*
11+
period_fields: (idcxs | width | aux | boundname)*
12+
auxiliary: "auxiliary"i array
13+
boundnames: "boundnames"i
14+
print_input: "print_input"i
15+
print_flows: "print_flows"i
16+
save_flows: "save_flows"i
17+
obs_filerecord: "obs_filerecord"i record
18+
maxbound: "maxbound"i integer
19+
idcxs: "idcxs"i list
20+
width: "width"i list
21+
aux: "aux"i list
22+
boundname: "boundname"i list
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Auto-generated grammar for MF6 CHF-CHD
2+
%import "typed.lark"
3+
4+
start: block*
5+
block: options_block | dimensions_block | period_block
6+
options_block: "begin"i "options"i options_fields "end"i "options"i
7+
dimensions_block: "begin"i "dimensions"i dimensions_fields "end"i "dimensions"i
8+
period_block: "begin"i "period"i period_fields "end"i "period"i
9+
options_fields: (auxiliary | auxmultname | boundnames | print_input | print_flows | save_flows | ts_filerecord | obs_filerecord)*
10+
dimensions_fields: (maxbound)*
11+
period_fields: (head | aux | boundname)*
12+
auxiliary: "auxiliary"i array
13+
auxmultname: "auxmultname"i string
14+
boundnames: "boundnames"i
15+
print_input: "print_input"i
16+
print_flows: "print_flows"i
17+
save_flows: "save_flows"i
18+
ts_filerecord: "ts_filerecord"i record
19+
obs_filerecord: "obs_filerecord"i record
20+
maxbound: "maxbound"i integer
21+
head: "head"i list
22+
aux: "aux"i list
23+
boundname: "boundname"i list
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Auto-generated grammar for MF6 CHF-CXS
2+
%import "typed.lark"
3+
4+
start: block*
5+
block: options_block | dimensions_block | packagedata_block | crosssectiondata_block
6+
options_block: "begin"i "options"i options_fields "end"i "options"i
7+
dimensions_block: "begin"i "dimensions"i dimensions_fields "end"i "dimensions"i
8+
packagedata_block: "begin"i "packagedata"i packagedata_fields "end"i "packagedata"i
9+
crosssectiondata_block: "begin"i "crosssectiondata"i crosssectiondata_fields "end"i "crosssectiondata"i
10+
options_fields: (print_input)*
11+
dimensions_fields: (nsections | npoints)*
12+
packagedata_fields: (packagedata)*
13+
crosssectiondata_fields: (crosssectiondata)*
14+
print_input: "print_input"i
15+
nsections: "nsections"i integer
16+
npoints: "npoints"i integer
17+
packagedata: "packagedata"i recarray
18+
crosssectiondata: "crosssectiondata"i recarray
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Auto-generated grammar for MF6 CHF-DFW
2+
%import "typed.lark"
3+
4+
start: block*
5+
block: options_block | griddata_block
6+
options_block: "begin"i "options"i options_fields "end"i "options"i
7+
griddata_block: "begin"i "griddata"i griddata_fields "end"i "griddata"i
8+
options_fields: (central_in_space | length_conversion | time_conversion | save_flows | print_flows | save_velocity | obs_filerecord | export_array_ascii | dev_swr_conductance)*
9+
griddata_fields: (manningsn | idcxs)*
10+
central_in_space: "central_in_space"i
11+
length_conversion: "length_conversion"i double precision
12+
time_conversion: "time_conversion"i double precision
13+
save_flows: "save_flows"i
14+
print_flows: "print_flows"i
15+
save_velocity: "save_velocity"i
16+
obs_filerecord: "obs_filerecord"i record
17+
export_array_ascii: "export_array_ascii"i
18+
dev_swr_conductance: "dev_swr_conductance"i
19+
manningsn: "manningsn"i array
20+
idcxs: "idcxs"i array
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Auto-generated grammar for MF6 CHF-DISV1D
2+
%import "typed.lark"
3+
4+
start: block*
5+
block: options_block | dimensions_block | griddata_block | vertices_block | cell1d_block
6+
options_block: "begin"i "options"i options_fields "end"i "options"i
7+
dimensions_block: "begin"i "dimensions"i dimensions_fields "end"i "dimensions"i
8+
griddata_block: "begin"i "griddata"i griddata_fields "end"i "griddata"i
9+
vertices_block: "begin"i "vertices"i vertices_fields "end"i "vertices"i
10+
cell1d_block: "begin"i "cell1d"i cell1d_fields "end"i "cell1d"i
11+
options_fields: (length_units | nogrb | grb_filerecord | xorigin | yorigin | angrot | export_array_ascii | crs)*
12+
dimensions_fields: (nodes | nvert)*
13+
griddata_fields: (width | bottom | idomain)*
14+
vertices_fields: (vertices)*
15+
cell1d_fields: (cell1d)*
16+
length_units: "length_units"i string
17+
nogrb: "nogrb"i
18+
grb_filerecord: "grb_filerecord"i record
19+
xorigin: "xorigin"i double precision
20+
yorigin: "yorigin"i double precision
21+
angrot: "angrot"i double precision
22+
export_array_ascii: "export_array_ascii"i
23+
crs: "crs"i array
24+
nodes: "nodes"i integer
25+
nvert: "nvert"i integer
26+
width: "width"i array
27+
bottom: "bottom"i array
28+
idomain: "idomain"i array
29+
vertices: "vertices"i recarray
30+
cell1d: "cell1d"i recarray
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Auto-generated grammar for MF6 CHF-EVP
2+
%import "typed.lark"
3+
4+
start: block*
5+
block: options_block | dimensions_block | period_block
6+
options_block: "begin"i "options"i options_fields "end"i "options"i
7+
dimensions_block: "begin"i "dimensions"i dimensions_fields "end"i "dimensions"i
8+
period_block: "begin"i "period"i period_fields "end"i "period"i
9+
options_fields: (auxiliary | auxmultname | boundnames | print_input | print_flows | save_flows | ts_filerecord | obs_filerecord)*
10+
dimensions_fields: (maxbound)*
11+
period_fields: (evaporation | aux | boundname)*
12+
auxiliary: "auxiliary"i array
13+
auxmultname: "auxmultname"i string
14+
boundnames: "boundnames"i
15+
print_input: "print_input"i
16+
print_flows: "print_flows"i
17+
save_flows: "save_flows"i
18+
ts_filerecord: "ts_filerecord"i record
19+
obs_filerecord: "obs_filerecord"i record
20+
maxbound: "maxbound"i integer
21+
evaporation: "evaporation"i list
22+
aux: "aux"i list
23+
boundname: "boundname"i list

0 commit comments

Comments
 (0)