1"""Python ownership and shared-context API regression. Takes module directory and repository root."""
4from pathlib
import Path
10sys.path.insert(0, sys.argv[1])
11import pyMoDELib
as model
12root = Path(sys.argv[2])
14with tempfile.TemporaryDirectory(prefix=
"modelib-python-bases-")
as directory:
15 folder = Path(directory)
16 inputs = folder /
"inputFiles"
18 (folder /
"F").mkdir()
19 shutil.copy(root /
"Library/Materials/W.txt", inputs /
"W.txt")
20 shutil.copy(root /
"Library/Meshes/unitCube24.msh", inputs /
"mesh.msh")
23 (inputs /
"DefectiveCrystal.txt").write_text(
24 f
"physics={physics};\nuseFEM=0;\nNsteps=0;\nmaxResolveSteps=0;\ndtMax=1;\n"
25 "outputFrequency=1;\noutputBinary=0;\nstartAtTimeStep=0;\n"
26 "periodicImageSize=0 0 0;\nEwaldLengthFactor=0;\n")
27 (inputs /
"polycrystal.txt").write_text(
28 "materialFile=W.txt;\nmeshFile=mesh.msh;\nabsoluteTemperature=300;\n"
29 "C2G1=1 0 0 0 1 0 0 0 1;\n"
30 f
"F={length:.17g} 0 0 0 {length:.17g} 0 0 0 {length:.17g};\n"
31 "X0=0 0 0;\nperiodicFaceIDs=-1;\n")
35 assert traits.configFolder == str(folder /
"config")
36 assert traits.auxFolder == traits.configFolder
40 assert base.dislocationDynamicsBase
is None
41 assert base.clusterDynamicsBase
is None
42 assert base.elasticDeformationBase
is base.elasticDeformation()
43 assert base.hasPhysics(
"ElasticDeformation")
44 assert base.periodicLatticeBasis.shape == (3, 3)
45 assert base.periodicCoordinates(np.zeros(3)).shape == (3,)
52 except RuntimeError
as error:
53 assert "not enabled" in str(error)
55 raise AssertionError(
"DD generation was allowed without DD")
58 configure(
"DislocationDynamics", 200 / math.sqrt(3))
60 dd = base.dislocationDynamicsBase
61 assert dd
is base.dislocationDynamics()
62 plane = dd.glidePlane(np.zeros(3), np.array([0., 0., 1.]), 1)
63 periodic = dd.periodicGlidePlane(np.zeros(3), np.array([0., 0., 1.]), 1)
64 assert dd.glidePlaneCount() >= 1
65 assert dd.periodicGlidePlaneCount() == 1
68 assert np.isfinite(dd.EwaldLength)
69 assert plane.planeBaseID() == periodic.referencePlane.planeBaseID()
72 assert plane.planeBaseID() == periodic.referencePlane.planeBaseID()
76 shutil.copy(root /
"tests/spatialCDtest/inputFiles/Zr4_Fitted.txt", inputs /
"Zr4_Fitted.txt")
78 poly = inputs /
"polycrystal.txt"
79 poly.write_text(poly.read_text().replace(
"W.txt",
"Zr4_Fitted.txt").replace(
"=300",
"=553"))
81 cd = base.clusterDynamicsBase
82 assert cd
is base.clusterDynamics()
83 assert base.dislocationDynamicsBase
is None
86 assert np.isfinite(cd.equilibriumMobileConcentration(0.)).all()
87 assert np.isfinite(cd.getDlocal()).all()
88print(
"PASS: Python base API, activation, and lifetimes")
92 np.eye(3), np.zeros(3), set())
94assert len(regions) == 2
96for region_id, region
in regions.items():
97 assert mesh.region(region_id)
is region
98 assert region.regionID == region_id
99 assert region.simplexIDs()
100 for face_id, face
in region.faces().items():
101 assert region.children[face_id]
is face
102 assert face.key == face_id == face.sID
103 assert face.parents[region_id]
is region
104 assert face.simplexIDs()
105 if face_id
in shared_faces:
106 assert shared_faces[face_id]
is face
107 assert not face.isExternal()
108 shared_faces[face_id] = face
109 for edge_key, edge
in face.children.items():
110 assert tuple(edge.key) == edge_key
111 assert edge.parents[face_id]
is face
112 assert len(edge.simplexIDs()) == 1
113 for vertex_key, vertex
in edge.children.items():
114 assert tuple(vertex.key) == vertex_key
115 assert vertex.parents[edge_key]
is edge
116 assert len(vertex.simplexIDs()) == 1
117assert any(
not face.isExternal()
for face
in shared_faces.values())
118print(
"PASS: Python unified polyhedral hierarchy")
configure(physics, length)