Skip to content

Commit 66a59b2

Browse files
committed
more cleanup
1 parent 5d1c290 commit 66a59b2

File tree

2 files changed

+49
-29
lines changed

2 files changed

+49
-29
lines changed

flopy4/mf6/codec/reader/grammar/templates/component.lark.jinja

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,15 @@
66
%ignore WS
77
%ignore SH_COMMENT
88

9+
// Top-level structure
910
start: block*
10-
block: {% for block_name in blocks.keys() %}{{ block_name }}_block{% if not loop.last %} | {% endif %}{% endfor %}
11+
block: {% for block_name in blocks.keys() %}
12+
{{- block_name }}_block
13+
{%- if not loop.last %} | {% endif %}
14+
{%- endfor %}
1115

12-
{% for block_name, block_ in blocks.items() %}
16+
// Block definitions
17+
{% for block_name, block_fields in blocks.items() %}
1318
{% if block_name == 'period' %}
1419
{{ block_name }}_block: "begin"i "{{ block_name }}"i block_index {{ block_name }}_fields "end"i "{{ block_name }}"i block_index
1520
{% else %}
@@ -19,19 +24,32 @@ block: {% for block_name in blocks.keys() %}{{ block_name }}_block{% if not loop
1924
{% if 'period' in blocks %}
2025
block_index: integer
2126
{% endif %}
22-
{% for block_name, block_ in blocks.items() %}
23-
{% set period_groups = block_|group_period_fields %}
27+
// Block field lists
28+
{% for block_name, block_fields in blocks.items() %}
29+
{% set period_groups = block_fields|group_period_fields %}
2430
{% if period_groups %}
31+
{# This block has period data (e.g., stress_period_data), split fields accordingly #}
2532
{% set recarray_name = block_name|get_recarray_name %}
2633
{% set grouped_field_names = period_groups.values()|first %}
2734
{% set non_grouped_fields = [] %}
28-
{% for field_name in block_.keys() %}{% if field_name not in grouped_field_names %}{% set _ = non_grouped_fields.append(field_name) %}{% endif %}{% endfor %}
29-
{{ block_name }}_fields: ({% for field_name in non_grouped_fields %}{{ field_name }} | {% endfor %}{{ recarray_name }})*
35+
{% for field_name in block_fields.keys() %}
36+
{%- if field_name not in grouped_field_names %}
37+
{%- set _ = non_grouped_fields.append(field_name) %}
38+
{%- endif %}
39+
{%- endfor %}
40+
{{ block_name }}_fields: (
41+
{%- for field_name in non_grouped_fields %}{{ field_name }} | {% endfor -%}
42+
{{ recarray_name }})*
3043
{% else %}
31-
{{ block_name }}_fields: ({% for field_name, field in block_.items() %}{{ field_name }}{% if not loop.last %} | {% endif
32-
%}{% endfor %})*
44+
{# Regular block - just list all fields #}
45+
{{ block_name }}_fields: (
46+
{%- for field_name in block_fields.keys() %}
47+
{{- field_name }}{% if not loop.last %} | {% endif %}
48+
{%- endfor -%}
49+
)*
3350
{% endif %}
3451
{% endfor %}
52+
// Individual field rules
3553
{% set grouped_fields = blocks|get_all_grouped_field_names %}
3654
{% for field_name, field in fields.items() %}
3755
{% if field_name not in grouped_fields %}
@@ -76,13 +94,13 @@ opt.type }}{% endif %}
7694
{% endfor %}
7795
{% endif %}
7896
{% endfor %}
79-
{# Generate recarray rules for grouped period fields #}
80-
{% for block_name, block_ in blocks.items() %}
81-
{% set period_groups = block_|group_period_fields %}
97+
// Recarray rules for period data (stress_period_data, etc.)
98+
{% for block_name, block_fields in blocks.items() %}
99+
{% set period_groups = block_fields|group_period_fields %}
82100
{% if period_groups %}
83101
{% set recarray_name = block_name|get_recarray_name %}
84102
{% set field_names = period_groups.values()|first %}
85-
{% set columns = field_names|get_recarray_columns(block_) %}
103+
{% set columns = field_names|get_recarray_columns(block_fields) %}
86104
{{ recarray_name}}: (number | simple_string)+ NEWLINE
87105
{% endif %}
88106
{% endfor %}

flopy4/mf6/codec/reader/transformer.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@
77
from modflow_devtools.dfn import Dfn
88

99

10+
def _parse_number(value: str) -> int | float:
11+
"""Parse a string into int or float based on its content."""
12+
try:
13+
if "." in value or "e" in value.lower():
14+
return float(value)
15+
else:
16+
return int(value)
17+
except ValueError:
18+
return float(value)
19+
20+
1021
class BasicTransformer(Transformer):
1122
"""
1223
Basic transformer for MF6 input files. Works only with the basic
@@ -41,14 +52,7 @@ def word(self, items: list[Token]) -> str:
4152
return str(items[0])
4253

4354
def NUMBER(self, token: Token) -> int | float:
44-
value = str(token)
45-
try:
46-
if "." in value or "e" in value.lower():
47-
return float(value)
48-
else:
49-
return int(value)
50-
except ValueError:
51-
return float(value)
55+
return _parse_number(str(token))
5256

5357
def CNAME(self, token: Token) -> str:
5458
return str(token)
@@ -175,14 +179,7 @@ def double(self, items: list[Any]) -> float:
175179

176180
def number(self, items: list[Any]) -> int | float:
177181
"""Handle generic number (could be int or float)."""
178-
value = str(items[0])
179-
try:
180-
if "." in value or "e" in value.lower():
181-
return float(value)
182-
else:
183-
return int(value)
184-
except ValueError:
185-
return float(value)
182+
return _parse_number(str(items[0]))
186183

187184
def data(self, items: list[Any]) -> np.ndarray:
188185
return np.array(items)
@@ -200,7 +197,12 @@ def stress_period_data(self, items: list[Any]) -> list[Any]:
200197
The parser gives us the values for one row plus a NEWLINE token.
201198
Filter out the NEWLINE token and return just the data values.
202199
"""
203-
return [item for item in items if not isinstance(item, Token) or item.type != "NEWLINE"]
200+
return [item for item in items if not self._is_newline_token(item)]
201+
202+
@staticmethod
203+
def _is_newline_token(item: Any) -> bool:
204+
"""Check if an item is a NEWLINE token."""
205+
return isinstance(item, Token) and item.type == "NEWLINE"
204206

205207
@staticmethod
206208
def try_create_dataarray(array_info: dict) -> dict:

0 commit comments

Comments
 (0)