plot3d 1.7.4__tar.gz → 1.7.6__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: plot3d
3
- Version: 1.7.4
3
+ Version: 1.7.6
4
4
  Summary: Plot3D python utilities for reading and writing and also finding connectivity between blocks
5
5
  Author: Paht Juangphanich
6
6
  Author-email: paht.juangphanich@nasa.gov
@@ -8,9 +8,10 @@ Requires-Python: >=3.10.12,<4.0.0
8
8
  Classifier: Programming Language :: Python :: 3
9
9
  Classifier: Programming Language :: Python :: 3.11
10
10
  Classifier: Programming Language :: Python :: 3.12
11
+ Requires-Dist: matplotlib
11
12
  Requires-Dist: networkx
12
13
  Requires-Dist: numpy
13
14
  Requires-Dist: pandas
14
- Requires-Dist: pymetis
15
+ Requires-Dist: pymetis ; platform_system != "Windows"
15
16
  Requires-Dist: scipy
16
17
  Requires-Dist: tqdm
@@ -161,8 +161,8 @@ def _write_bsurf_spec(w, bc):
161
161
  # GIF + Volume Zone writers (dict inputs supported)
162
162
  # ============================================================
163
163
  def _write_gif_from_dict(w, gdict: Dict[str, Any]) -> None:
164
- sid1 = int(gdict.get("id1", 0))
165
- sid2 = int(gdict.get("id2", 0))
164
+ sid1 = int(gdict.get("a", 0))
165
+ sid2 = int(gdict.get("b", 0))
166
166
  name1 = f"surface {sid1}"
167
167
  name2 = f"surface {sid2}"
168
168
  bctype = 4 # GIF
@@ -312,7 +312,7 @@ def export_to_boundary_condition(
312
312
  file_path_to_write: str,
313
313
  job_settings: Job,
314
314
  bc_group: BCGroup,
315
- gifs: List[GIF] | List[Dict[str,Any]],
315
+ gif_pairs: List[GIF] | List[Dict[str,Any]],
316
316
  volume_zones: List[VolumeZone] | List[Dict[str,Any]],
317
317
  ):
318
318
  file_path_to_write = ensure_extension(file_path_to_write, '.bcs')
@@ -326,10 +326,10 @@ def export_to_boundary_condition(
326
326
  "slips": [_asdict_soft(x) for x in bc_group.SymmetricSlips],
327
327
  "walls": [_asdict_soft(x) for x in bc_group.Walls],
328
328
  "volume_zones": [x for x in volume_zones],
329
- "gifs": [_asdict_soft(x) for x in gifs],
329
+ "gif_pairs": [_asdict_soft(x) for x in gif_pairs],
330
330
  "job_settings": _asdict_soft(job_settings),
331
331
  }
332
- json_path.write_text(json.dumps(json_payload, indent=2))
332
+ json_path.write_text(json.dumps(json_payload, indent=4))
333
333
 
334
334
  # ---- Robust reference defaults (use inlet values if missing)
335
335
  ref = job_settings.ReferenceCondFull
@@ -383,21 +383,21 @@ def export_to_boundary_condition(
383
383
  _write_bsurf_spec(w, wall)
384
384
 
385
385
  # GIFS (dicts or dataclasses)
386
- for g in gifs:
387
- if isinstance(g, dict):
388
- _write_gif_from_dict(w, g)
386
+ for pair in gif_pairs:
387
+ if isinstance(pair, dict):
388
+ _write_gif_from_dict(w, pair)
389
389
  else:
390
- name1 = getattr(g, "Name1", f"surface {g.GIFSurface1}")
391
- name2 = getattr(g, "Name2", f"surface {g.GIFSurface2}")
390
+ name1 = getattr(pair, "Name1", f"surface {pair.GIFSurface1}")
391
+ name2 = getattr(pair, "Name2", f"surface {pair.GIFSurface2}")
392
392
  w.write(
393
- f" &BSurf_Spec\nBSurfID={g.GIFSurface1}, BCType={int(g.BCType)}, "
393
+ f" &BSurf_Spec\nBSurfID={pair.GIFSurface1}, BCType={int(pair.BCType)}, "
394
394
  f"BSurfName='{name1}'\n &END\n\n"
395
395
  )
396
396
  w.write(
397
- f" &BSurf_Spec\nBSurfID={g.GIFSurface2}, BCType={int(g.BCType)}, "
397
+ f" &BSurf_Spec\nBSurfID={pair.GIFSurface2}, BCType={int(pair.BCType)}, "
398
398
  f"BSurfName='{name2}'\n &END\n\n"
399
399
  )
400
- w.write(f" &GIF_Spec\nSurfID_1={g.GIFSurface1}, SurfID2={g.GIFSurface2}\n &END\n\n")
400
+ w.write(f" &GIF_Spec\nSurfID_1={pair.GIFSurface1}, SurfID2={pair.GIFSurface2}\n &END\n\n")
401
401
 
402
402
  # VZConditions (dict templates)
403
403
  volume_zone_unique = {d["contiguous_index"]: d for d in volume_zones}.values()
@@ -4,8 +4,18 @@ from __future__ import annotations
4
4
  from pathlib import Path
5
5
  from typing import Dict, List, Sequence, Tuple, Optional
6
6
  import inspect
7
-
8
- import pymetis # pip install pymetis
7
+ import sys
8
+
9
+ if sys.platform != "win32":
10
+ try:
11
+ import pymetis # type: ignore
12
+ HAS_PYMETIS = True
13
+ except Exception: # pragma: no cover - optional dependency
14
+ pymetis = None # type: ignore
15
+ HAS_PYMETIS = False
16
+ else:
17
+ pymetis = None # type: ignore
18
+ HAS_PYMETIS = False
9
19
  from .block import Block # <-- use your existing Block
10
20
 
11
21
 
@@ -139,7 +149,13 @@ def _metis_part_graph_compat(
139
149
  Returns:
140
150
  (edgecut, parts)
141
151
  """
142
- sig_params = set(inspect.signature(pymetis.part_graph).parameters.keys())
152
+ if not HAS_PYMETIS:
153
+ raise RuntimeError(
154
+ "pymetis is not available. On Windows it is skipped during install; "
155
+ "use Linux/macOS to enable METIS-based partitioning."
156
+ )
157
+
158
+ sig_params = set(inspect.signature(pymetis.part_graph).parameters.keys()) # type: ignore[attr-defined]
143
159
 
144
160
  # Prefer keyword args when supported
145
161
  if {"xadj", "adjncy"}.issubset(sig_params):
@@ -194,6 +210,12 @@ def partition_from_face_matches(
194
210
  edge_w : Dict[int, Dict[int, int]]
195
211
  Edge weights.
196
212
  """
213
+ if not HAS_PYMETIS:
214
+ raise RuntimeError(
215
+ "METIS partitioning is disabled because pymetis is unavailable. "
216
+ "Install pymetis (Linux/macOS) or run on a platform where it is supported."
217
+ )
218
+
197
219
  n_blocks = len(blocks)
198
220
  adj_list, edge_w = build_weighted_graph_from_face_matches(
199
221
  face_matches, n_blocks,
@@ -234,6 +234,8 @@ def read_gridpro_connectivity(
234
234
  # GIF faces grouped by sf1 for pty in 12..21 or == 1000
235
235
  gif_faces: List[Dict[str, int]] = []
236
236
  for p in patches:
237
+ #? This is how we identify gifs inside of a grid pro connectivity file.
238
+ #? If the PTY is between 12 and 21 these are gifs
237
239
  if (12 <= p["pty"] <= 21) or (p["pty"] == 1000): # type: ignore
238
240
  face_temp = face_dict(p["sb1"], p["L1i"], p["L1j"], p["L1k"], p["H1i"], p["H1j"], p["H1k"]) # type: ignore
239
241
  face_temp["id"] = p["pty"] # type: ignore
@@ -365,7 +365,7 @@ def rotated_periodicity(blocks:List[Block], matched_faces:List[Dict[str,int]], o
365
365
  """
366
366
  gcd_array = list()
367
367
  # Find the gcd of all the blocks
368
- if ReduceMesh==True:
368
+ if ReduceMesh:
369
369
  for block_indx in range(len(blocks)):
370
370
  block = blocks[block_indx]
371
371
  gcd_array.append(math.gcd(block.IMAX-1, math.gcd(block.JMAX-1, block.KMAX-1)))
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "plot3d"
3
- version = "1.7.4"
3
+ version = "1.7.6"
4
4
  description = "Plot3D python utilities for reading and writing and also finding connectivity between blocks"
5
5
  authors = ["Paht Juangphanich <paht.juangphanich@nasa.gov>"]
6
6
 
@@ -11,7 +11,8 @@ scipy = "*"
11
11
  pandas = "*"
12
12
  tqdm = "*"
13
13
  networkx = "*"
14
- pymetis = "*"
14
+ pymetis = { version = "*", markers = "platform_system != 'Windows'" }
15
+ matplotlib = "*"
15
16
 
16
17
  [tool.poetry.group.deve.dependencies]
17
18
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes