Merge pull request #167935 from wd15/fipy-fix-build
python3Packages.fipy: fix broken build
This commit is contained in:
commit
c3a33d9bb4
2 changed files with 190 additions and 0 deletions
|
@ -39,6 +39,14 @@ buildPythonPackage rec {
|
|||
] ++ lib.optionals isPy27 [ pysparse ]
|
||||
++ lib.optionals (!stdenv.isDarwin) [ gmsh ];
|
||||
|
||||
# Reading version string from Gmsh is broken in latest release of FiPy
|
||||
# This issue is repaired on master branch of FiPy
|
||||
# Fixed with: https://github.com/usnistgov/fipy/pull/848/files
|
||||
# Remove patch with next release.
|
||||
patches = [ ./gmsh.patch ];
|
||||
|
||||
checkInputs = lib.optionals (!stdenv.isDarwin) [ gmsh ];
|
||||
|
||||
checkPhase = ''
|
||||
export OMPI_MCA_plm_rsh_agent=${openssh}/bin/ssh
|
||||
${python.interpreter} setup.py test --modules
|
||||
|
|
182
pkgs/development/python-modules/fipy/gmsh.patch
Normal file
182
pkgs/development/python-modules/fipy/gmsh.patch
Normal file
|
@ -0,0 +1,182 @@
|
|||
diff --git a/fipy/meshes/gmshMesh.py b/fipy/meshes/gmshMesh.py
|
||||
index fc3ff6c8..d529d532 100755
|
||||
--- a/fipy/meshes/gmshMesh.py
|
||||
+++ b/fipy/meshes/gmshMesh.py
|
||||
@@ -13,11 +13,11 @@ import sys
|
||||
import tempfile
|
||||
from textwrap import dedent
|
||||
import warnings
|
||||
-from distutils.version import StrictVersion
|
||||
|
||||
from fipy.tools import numerix as nx
|
||||
from fipy.tools import parallelComm
|
||||
from fipy.tools import serialComm
|
||||
+from fipy.tools.version import Version, parse_version
|
||||
from fipy.tests.doctestPlus import register_skipper
|
||||
|
||||
from fipy.meshes.mesh import Mesh
|
||||
@@ -38,7 +38,7 @@ def _checkForGmsh():
|
||||
hasGmsh = True
|
||||
try:
|
||||
version = _gmshVersion(communicator=parallelComm)
|
||||
- hasGmsh = version >= StrictVersion("2.0")
|
||||
+ hasGmsh = version >= Version("2.0")
|
||||
except Exception:
|
||||
hasGmsh = False
|
||||
return hasGmsh
|
||||
@@ -68,6 +68,7 @@ def gmshVersion(communicator=parallelComm):
|
||||
while True:
|
||||
try:
|
||||
# gmsh returns version in stderr (Why?!?)
|
||||
+ # (newer versions of gmsh return the version in stdout)
|
||||
# spyder on Windows throws
|
||||
# OSError: [WinError 6] The handle is invalid
|
||||
# if we don't PIPE stdout, too
|
||||
@@ -77,8 +78,11 @@ def gmshVersion(communicator=parallelComm):
|
||||
break
|
||||
|
||||
try:
|
||||
- out, verStr = p.communicate()
|
||||
- verStr = verStr.decode('ascii').strip()
|
||||
+ out, err = p.communicate()
|
||||
+ verStr = err.decode('ascii').strip()
|
||||
+ if not verStr:
|
||||
+ # newer versions of gmsh return the version in stdout
|
||||
+ verStr = out.decode('ascii').strip()
|
||||
break
|
||||
except IOError:
|
||||
# some weird conflict with things like PyQT can cause
|
||||
@@ -93,12 +97,12 @@ def gmshVersion(communicator=parallelComm):
|
||||
def _gmshVersion(communicator=parallelComm):
|
||||
version = gmshVersion(communicator) or "0.0"
|
||||
try:
|
||||
- version = StrictVersion(version)
|
||||
+ version = parse_version(version)
|
||||
except ValueError:
|
||||
# gmsh returns the version string in stderr,
|
||||
# which means it's often unparsable due to irrelevant warnings
|
||||
# assume it's OK and move on
|
||||
- version = StrictVersion("3.0")
|
||||
+ version = Version("3.0")
|
||||
|
||||
return version
|
||||
|
||||
@@ -133,7 +137,7 @@ def openMSHFile(name, dimensions=None, coordDimensions=None, communicator=parall
|
||||
|
||||
# Enforce gmsh version to be either >= 2 or 2.5, based on Nproc.
|
||||
version = _gmshVersion(communicator=communicator)
|
||||
- if version < StrictVersion("2.0"):
|
||||
+ if version < Version("2.0"):
|
||||
raise EnvironmentError("Gmsh version must be >= 2.0.")
|
||||
|
||||
# If we're being passed a .msh file, leave it be. Otherwise,
|
||||
@@ -176,9 +180,11 @@ def openMSHFile(name, dimensions=None, coordDimensions=None, communicator=parall
|
||||
gmshFlags = ["-%d" % dimensions, "-nopopup"]
|
||||
|
||||
if communicator.Nproc > 1:
|
||||
- if not (StrictVersion("2.5") < version <= StrictVersion("4.0")):
|
||||
- warnstr = "Cannot partition with Gmsh version < 2.5 or >= 4.0. " \
|
||||
- + "Reverting to serial."
|
||||
+ if ((version < Version("2.5"))
|
||||
+ or (Version("4.0") <= version < Version("4.5.2"))):
|
||||
+ warnstr = ("Cannot partition with Gmsh version < 2.5 "
|
||||
+ "or 4.0 <= version < 4.5.2. "
|
||||
+ "Reverting to serial.")
|
||||
warnings.warn(warnstr, RuntimeWarning, stacklevel=2)
|
||||
communicator = serialComm
|
||||
|
||||
@@ -188,13 +194,13 @@ def openMSHFile(name, dimensions=None, coordDimensions=None, communicator=parall
|
||||
raise ValueError("'dimensions' must be specified to generate a mesh from a geometry script")
|
||||
else: # gmsh version is adequate for partitioning
|
||||
gmshFlags += ["-part", "%d" % communicator.Nproc]
|
||||
- if version >= StrictVersion("4.0"):
|
||||
+ if version >= Version("4.0"):
|
||||
# Gmsh 4.x needs to be told to generate ghost cells
|
||||
- # Unfortunately, the ghosts are broken
|
||||
+ # Unfortunately, the ghosts are broken in Gmsh 4.0--4.5.1
|
||||
# https://gitlab.onelab.info/gmsh/gmsh/issues/733
|
||||
gmshFlags += ["-part_ghosts"]
|
||||
|
||||
- gmshFlags += ["-format", "msh2"]
|
||||
+ gmshFlags += ["-format", "msh2", "-smooth", "8"]
|
||||
|
||||
if background is not None:
|
||||
if communicator.procID == 0:
|
||||
@@ -1387,6 +1393,11 @@ class _GmshTopology(_MeshTopology):
|
||||
class Gmsh2D(Mesh2D):
|
||||
"""Construct a 2D Mesh using Gmsh
|
||||
|
||||
+ If called in parallel, the mesh will be partitioned based on the value
|
||||
+ of `parallelComm.Nproc`. If an `MSH` file is supplied, it must have
|
||||
+ been previously partitioned with the number of partitions matching
|
||||
+ `parallelComm.Nproc`.
|
||||
+
|
||||
>>> radius = 5.
|
||||
>>> side = 4.
|
||||
>>> squaredCircle = Gmsh2D('''
|
||||
@@ -1875,6 +1886,11 @@ class Gmsh2D(Mesh2D):
|
||||
class Gmsh2DIn3DSpace(Gmsh2D):
|
||||
"""Create a topologically 2D Mesh in 3D coordinates using Gmsh
|
||||
|
||||
+ If called in parallel, the mesh will be partitioned based on the value
|
||||
+ of `parallelComm.Nproc`. If an `MSH` file is supplied, it must have
|
||||
+ been previously partitioned with the number of partitions matching
|
||||
+ `parallelComm.Nproc`.
|
||||
+
|
||||
Parameters
|
||||
----------
|
||||
arg : str
|
||||
@@ -1959,6 +1975,11 @@ class Gmsh2DIn3DSpace(Gmsh2D):
|
||||
class Gmsh3D(Mesh):
|
||||
"""Create a 3D Mesh using Gmsh
|
||||
|
||||
+ If called in parallel, the mesh will be partitioned based on the value
|
||||
+ of `parallelComm.Nproc`. If an `MSH` file is supplied, it must have
|
||||
+ been previously partitioned with the number of partitions matching
|
||||
+ `parallelComm.Nproc`.
|
||||
+
|
||||
Parameters
|
||||
----------
|
||||
arg : str
|
||||
@@ -2225,7 +2246,7 @@ class GmshGrid2D(Gmsh2D):
|
||||
width = nx * dx
|
||||
numLayers = int(ny / float(dy))
|
||||
|
||||
- if _gmshVersion() < StrictVersion("2.7"):
|
||||
+ if _gmshVersion() < Version("2.7"):
|
||||
# kludge: must offset cellSize by `eps` to work properly
|
||||
eps = float(dx)/(nx * 10)
|
||||
else:
|
||||
@@ -2299,7 +2320,7 @@ class GmshGrid3D(Gmsh3D):
|
||||
width = nx * dx
|
||||
depth = nz * dz
|
||||
|
||||
- if _gmshVersion() < StrictVersion("2.7"):
|
||||
+ if _gmshVersion() < Version("2.7"):
|
||||
# kludge: must offset cellSize by `eps` to work properly
|
||||
eps = float(dx)/(nx * 10)
|
||||
else:
|
||||
diff --git a/fipy/tools/version.py b/fipy/tools/version.py
|
||||
new file mode 100644
|
||||
index 00000000..93d89c18
|
||||
--- /dev/null
|
||||
+++ b/fipy/tools/version.py
|
||||
@@ -0,0 +1,18 @@
|
||||
+"""Shim for version checking
|
||||
+
|
||||
+`distutils.version` is deprecated, but `packaging.version` is unavailable
|
||||
+in Python 2.7
|
||||
+"""
|
||||
+from __future__ import unicode_literals
|
||||
+
|
||||
+__docformat__ = 'restructuredtext'
|
||||
+
|
||||
+
|
||||
+__all__ = ["Version", "parse_version"]
|
||||
+from future.utils import text_to_native_str
|
||||
+__all__ = [text_to_native_str(n) for n in __all__]
|
||||
+
|
||||
+try:
|
||||
+ from packaging.version import Version, parse as parse_version
|
||||
+except ImportError:
|
||||
+ from distutils.version import StrictVersion as Version, StrictVersion as parse_version
|
Loading…
Reference in a new issue