foamlib 0.3.0__tar.gz → 0.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: foamlib
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: A Python interface for interacting with OpenFOAM
5
5
  Author-email: "Gabriel S. Gerlero" <ggerlero@cimec.unl.edu.ar>
6
6
  Project-URL: Homepage, https://github.com/gerlero/foamlib
@@ -1,6 +1,6 @@
1
1
  """A Python interface for interacting with OpenFOAM."""
2
2
 
3
- __version__ = "0.3.0"
3
+ __version__ = "0.3.1"
4
4
 
5
5
  from ._cases import AsyncFoamCase, FoamCase, FoamCaseBase
6
6
  from ._files import FoamDict, FoamFieldFile, FoamFile
@@ -1,7 +1,7 @@
1
1
  import sys
2
2
  from abc import abstractmethod
3
3
  from dataclasses import dataclass
4
- from typing import Dict, NamedTuple, Optional, Union
4
+ from typing import Dict, NamedTuple, Optional, Tuple, Union
5
5
 
6
6
  if sys.version_info >= (3, 9):
7
7
  from collections.abc import Mapping, Sequence
@@ -10,7 +10,6 @@ else:
10
10
 
11
11
  try:
12
12
  import numpy as np
13
- from numpy.typing import NDArray
14
13
  except ModuleNotFoundError:
15
14
  pass
16
15
 
@@ -59,4 +58,16 @@ class FoamDict:
59
58
  """Return a nested dict representation of the dictionary."""
60
59
  raise NotImplementedError
61
60
 
62
- _SetData = Union[Data, "NDArray[np.generic]"]
61
+ _SetData = Union[
62
+ str,
63
+ int,
64
+ float,
65
+ bool,
66
+ Dimensioned,
67
+ DimensionSet,
68
+ Sequence["_SetData"],
69
+ Mapping[str, "_SetData"],
70
+ "np.ndarray[Tuple[()], np.dtype[np.generic]]",
71
+ "np.ndarray[Tuple[int], np.dtype[np.generic]]",
72
+ "np.ndarray[Tuple[int, int], np.dtype[np.generic]]",
73
+ ]
@@ -10,7 +10,6 @@ from ._files import FoamFile
10
10
 
11
11
  try:
12
12
  import numpy as np
13
- from numpy.typing import NDArray
14
13
  except ModuleNotFoundError:
15
14
  pass
16
15
 
@@ -58,7 +57,9 @@ class FoamFieldFile(FoamFile):
58
57
  int,
59
58
  float,
60
59
  Sequence[Union[int, float, Sequence[Union[int, float]]]],
61
- "NDArray[np.generic]",
60
+ "np.ndarray[Tuple[()], np.dtype[np.generic]]",
61
+ "np.ndarray[Tuple[int], np.dtype[np.generic]]",
62
+ "np.ndarray[Tuple[int, int], np.dtype[np.generic]]",
62
63
  ]:
63
64
  """Alias of `self["value"]`."""
64
65
  ret = self["value"]
@@ -73,7 +74,9 @@ class FoamFieldFile(FoamFile):
73
74
  int,
74
75
  float,
75
76
  Sequence[Union[int, float, Sequence[Union[int, float]]]],
76
- "NDArray[np.generic]",
77
+ "np.ndarray[Tuple[()], np.dtype[np.generic]]",
78
+ "np.ndarray[Tuple[int], np.dtype[np.generic]]",
79
+ "np.ndarray[Tuple[int, int], np.dtype[np.generic]]",
77
80
  ],
78
81
  ) -> None:
79
82
  self["value"] = value
@@ -128,7 +131,9 @@ class FoamFieldFile(FoamFile):
128
131
  int,
129
132
  float,
130
133
  Sequence[Union[int, float, Sequence[Union[int, float]]]],
131
- "NDArray[np.generic]",
134
+ "np.ndarray[Tuple[()], np.dtype[np.generic]]",
135
+ "np.ndarray[Tuple[int], np.dtype[np.generic]]",
136
+ "np.ndarray[Tuple[int, int], np.dtype[np.generic]]",
132
137
  ]:
133
138
  """Alias of `self["internalField"]`."""
134
139
  ret = self["internalField"]
@@ -143,7 +148,9 @@ class FoamFieldFile(FoamFile):
143
148
  int,
144
149
  float,
145
150
  Sequence[Union[int, float, Sequence[Union[int, float]]]],
146
- "NDArray[np.generic]",
151
+ "np.ndarray[Tuple[()], np.dtype[np.generic]]",
152
+ "np.ndarray[Tuple[int], np.dtype[np.generic]]",
153
+ "np.ndarray[Tuple[int, int], np.dtype[np.generic]]",
147
154
  ],
148
155
  ) -> None:
149
156
  self["internalField"] = value
@@ -12,7 +12,7 @@ else:
12
12
 
13
13
  from ._base import FoamDict
14
14
  from ._io import FoamFileIO
15
- from ._serialization import serialize_keyword_entry
15
+ from ._serialization import serialize
16
16
 
17
17
 
18
18
  class FoamFile(
@@ -134,7 +134,7 @@ class FoamFile(
134
134
  start, end = parsed.entry_location(keywords, missing_ok=True)
135
135
 
136
136
  self._write(
137
- f"{contents[:start]}\n{serialize_keyword_entry(keywords[-1], {})}\n{contents[end:]}"
137
+ f"{contents[:start]}\n{serialize({keywords[-1]: {}})}\n{contents[end:]}"
138
138
  )
139
139
 
140
140
  for k, v in data.items():
@@ -143,7 +143,7 @@ class FoamFile(
143
143
  start, end = parsed.entry_location(keywords, missing_ok=True)
144
144
 
145
145
  self._write(
146
- f"{contents[:start]}\n{serialize_keyword_entry(keywords[-1], data, assume_field=assume_field, assume_dimensions=assume_dimensions)}\n{contents[end:]}"
146
+ f"{contents[:start]}\n{serialize({keywords[-1]: data}, assume_field=assume_field, assume_dimensions=assume_dimensions)}\n{contents[end:]}"
147
147
  )
148
148
 
149
149
  def __setitem__(
@@ -0,0 +1,83 @@
1
+ import sys
2
+
3
+ if sys.version_info >= (3, 9):
4
+ from collections.abc import Mapping
5
+ else:
6
+ from typing import Mapping
7
+
8
+ from .._util import is_sequence
9
+ from ._base import FoamDict
10
+
11
+
12
+ def serialize(
13
+ data: FoamDict._SetData,
14
+ *,
15
+ assume_field: bool = False,
16
+ assume_dimensions: bool = False,
17
+ assume_data_entries: bool = False,
18
+ ) -> str:
19
+ if isinstance(data, Mapping):
20
+ entries = []
21
+ for k, v in data.items():
22
+ s = serialize(
23
+ v,
24
+ assume_field=assume_field,
25
+ assume_dimensions=assume_dimensions,
26
+ assume_data_entries=True,
27
+ )
28
+ if isinstance(v, Mapping):
29
+ entries.append(f"{k}\n{{\n{s}\n}}")
30
+ elif s:
31
+ entries.append(f"{k} {s};")
32
+ else:
33
+ entries.append(f"{k};")
34
+ return "\n".join(entries)
35
+
36
+ elif isinstance(data, FoamDict.DimensionSet) or (
37
+ assume_dimensions and is_sequence(data) and len(data) == 7
38
+ ):
39
+ return f"[{' '.join(str(v) for v in data)}]"
40
+
41
+ elif assume_field and isinstance(data, (int, float)):
42
+ return f"uniform {data}"
43
+
44
+ elif assume_field and is_sequence(data):
45
+ if isinstance(data[0], (int, float)) and len(data) in (3, 6, 9):
46
+ return f"uniform {serialize(data)}"
47
+ elif isinstance(data[0], (int, float)):
48
+ return f"nonuniform List<scalar> {len(data)}{serialize(data)}"
49
+ elif len(data[0]) == 3:
50
+ return f"nonuniform List<vector> {len(data)}{serialize(data)}"
51
+ elif len(data[0]) == 6:
52
+ return f"nonuniform List<symmTensor> {len(data)}{serialize(data)}"
53
+ elif len(data[0]) == 9:
54
+ return f"nonuniform List<tensor> {len(data)}{serialize(data)}"
55
+ else:
56
+ return serialize(
57
+ data,
58
+ assume_dimensions=assume_dimensions,
59
+ assume_data_entries=assume_data_entries,
60
+ )
61
+
62
+ elif assume_data_entries and isinstance(data, tuple):
63
+ return " ".join(
64
+ serialize(v, assume_field=assume_field, assume_dimensions=assume_dimensions)
65
+ for v in data
66
+ )
67
+
68
+ elif isinstance(data, FoamDict.Dimensioned):
69
+ if data.name is not None:
70
+ return f"{data.name} {serialize(data.dimensions, assume_dimensions=True)} {serialize(data.value)}"
71
+ else:
72
+ return f"{serialize(data.dimensions, assume_dimensions=True)} {serialize(data.value)}"
73
+
74
+ elif is_sequence(data):
75
+ return f"({' '.join(serialize(v) for v in data)})"
76
+
77
+ elif data is True:
78
+ return "yes"
79
+ elif data is False:
80
+ return "no"
81
+
82
+ else:
83
+ return str(data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: foamlib
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: A Python interface for interacting with OpenFOAM
5
5
  Author-email: "Gabriel S. Gerlero" <ggerlero@cimec.unl.edu.ar>
6
6
  Project-URL: Homepage, https://github.com/gerlero/foamlib
@@ -1,156 +0,0 @@
1
- import sys
2
- from contextlib import suppress
3
-
4
- if sys.version_info >= (3, 9):
5
- from collections.abc import Mapping
6
- else:
7
- from typing import Mapping
8
-
9
- from .._util import is_sequence
10
- from ._base import FoamDict
11
-
12
-
13
- def _serialize_switch(data: FoamDict._SetData) -> str:
14
- if data is True:
15
- return "yes"
16
- elif data is False:
17
- return "no"
18
- else:
19
- raise TypeError(f"Not a bool: {type(data)}")
20
-
21
-
22
- def _serialize_list(
23
- data: FoamDict._SetData,
24
- ) -> str:
25
- if is_sequence(data):
26
- return f"({' '.join(_serialize_data_entry(v) for v in data)})"
27
- else:
28
- raise TypeError(f"Not a valid sequence: {type(data)}")
29
-
30
-
31
- def _serialize_field(
32
- data: FoamDict._SetData,
33
- ) -> str:
34
- if is_sequence(data):
35
- try:
36
- s = _serialize_list(data)
37
- except TypeError:
38
- raise TypeError(f"Not a valid field: {type(data)}") from None
39
- else:
40
- if not is_sequence(data[0]) and len(data) < 10:
41
- return f"uniform {s}"
42
- else:
43
- if not is_sequence(data[0]):
44
- kind = "scalar"
45
- elif len(data[0]) == 3:
46
- kind = "vector"
47
- elif len(data[0]) == 6:
48
- kind = "symmTensor"
49
- elif len(data[0]) == 9:
50
- kind = "tensor"
51
- else:
52
- raise TypeError(
53
- f"Unsupported sequence length for field: {len(data[0])}"
54
- )
55
- return f"nonuniform List<{kind}> {len(data)}{s}"
56
- else:
57
- return f"uniform {data}"
58
-
59
-
60
- def _serialize_dimensions(
61
- data: FoamDict._SetData,
62
- ) -> str:
63
- if is_sequence(data) and len(data) == 7:
64
- return f"[{' '.join(str(v) for v in data)}]"
65
- else:
66
- raise TypeError(f"Not a valid dimension set: {type(data)}")
67
-
68
-
69
- def _serialize_dimensioned(
70
- data: FoamDict._SetData,
71
- ) -> str:
72
- if isinstance(data, FoamDict.Dimensioned):
73
- if data.name is not None:
74
- return f"{data.name} {_serialize_dimensions(data.dimensions)} {_serialize_data_entry(data.value)}"
75
- else:
76
- return f"{_serialize_dimensions(data.dimensions)} {_serialize_data_entry(data.value)}"
77
- else:
78
- raise TypeError(f"Not a valid dimensioned value: {type(data)}")
79
-
80
-
81
- def _serialize_data_entry(
82
- data: FoamDict._SetData,
83
- *,
84
- assume_field: bool = False,
85
- assume_dimensions: bool = False,
86
- ) -> str:
87
- if isinstance(data, FoamDict.DimensionSet) or assume_dimensions:
88
- with suppress(TypeError):
89
- return _serialize_dimensions(data)
90
-
91
- if assume_field:
92
- with suppress(TypeError):
93
- return _serialize_field(data)
94
-
95
- with suppress(TypeError):
96
- return _serialize_dimensioned(data)
97
-
98
- with suppress(TypeError):
99
- return _serialize_list(data)
100
-
101
- with suppress(TypeError):
102
- return _serialize_switch(data)
103
-
104
- with suppress(TypeError):
105
- return _serialize_dictionary(data)
106
-
107
- return str(data)
108
-
109
-
110
- def _serialize_data_entries(
111
- data: FoamDict._SetData,
112
- *,
113
- assume_field: bool = False,
114
- assume_dimensions: bool = False,
115
- ) -> str:
116
- if isinstance(data, FoamDict.DimensionSet) or assume_dimensions:
117
- with suppress(TypeError):
118
- return _serialize_dimensions(data)
119
-
120
- if assume_field:
121
- with suppress(TypeError):
122
- return _serialize_field(data)
123
-
124
- if isinstance(data, tuple):
125
- return " ".join(_serialize_data_entry(v) for v in data)
126
-
127
- return _serialize_data_entry(data)
128
-
129
-
130
- def _serialize_dictionary(
131
- data: FoamDict._SetData,
132
- ) -> str:
133
- if isinstance(data, Mapping):
134
- return "\n".join(serialize_keyword_entry(k, v) for k, v in data.items())
135
- else:
136
- raise TypeError(f"Not a valid dictionary: {type(data)}")
137
-
138
-
139
- def serialize_keyword_entry(
140
- keyword: str,
141
- data: FoamDict._SetData,
142
- *,
143
- assume_field: bool = False,
144
- assume_dimensions: bool = False,
145
- ) -> str:
146
- with suppress(TypeError):
147
- return f"{keyword}\n{{\n{_serialize_dictionary(data)}\n}}"
148
-
149
- data = _serialize_data_entries(
150
- data, assume_field=assume_field, assume_dimensions=assume_dimensions
151
- )
152
-
153
- if not data:
154
- return f"{keyword};"
155
- else:
156
- return f"{keyword} {data};"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes