diff --git a/test/test_python_interface/pybind11/test_common.py b/test/test_python_interface/pybind11/test_common.py index 68750d6bf..4b5df6629 100644 --- a/test/test_python_interface/pybind11/test_common.py +++ b/test/test_python_interface/pybind11/test_common.py @@ -1,238 +1,238 @@ # import pybind11 import pytest import os import subprocess import numpy as np import py11_akantu_test_common as aka def test_array_size(): ptr, array = aka.createArray(1000, 3) assert array.shape == (1000, 3) def test_array_nocopy(): ptr, array = aka.createArray(1000, 3) through_python = aka.getRawPointerArray(array) assert(ptr == through_python) def test_modify_array(): ptr, array = aka.createArray(3, 3) array[0, :] = (1., 2., 3.) array2 = aka.getArray(ptr) assert(np.linalg.norm(array-array2) < 1e-15) for i in [1, 2, 3]: ptr, array = aka.createArray(10000, i) array[:, :] = np.random.random((10000, i)) array2 = aka.getArray(ptr) assert(np.linalg.norm(array-array2) < 1e-15) def test_array_copy(): ptr, array = aka.createArray(1000, 3) array2 = aka.copyArray(ptr) ptr2 = aka.getRawPointerArray(array2) assert(ptr != ptr2) def test_vector_size(): ptr, vector = aka.createVector(3) assert vector.shape == (3,) def test_vector_nocopy(): ptr, vector = aka.createVector(3) through_python = aka.getRawPointerVector(vector) assert(ptr == through_python) def test_modify_vector(): ptr, vector = aka.createVector(3) vector[:] = (1., 2., 3.) vector2 = aka.getVector(ptr) assert(np.linalg.norm(vector-vector2) < 1e-15) for i in np.arange(1, 10): ptr, vector = aka.createVector(i) vector[:] = np.random.random(i) vector2 = aka.getVector(ptr) assert(np.linalg.norm(vector-vector2) < 1e-15) def test_vector_copy(): ptr, vector = aka.createVector(1000) vector2 = aka.copyVector(ptr) ptr2 = aka.getRawPointerVector(vector2) assert(ptr != ptr2) def test_matrix_size(): ptr, matrix = aka.createMatrix(3, 2) assert matrix.shape == (3, 2) def test_matrix_nocopy(): ptr, matrix = aka.createMatrix(3, 2) through_python = aka.getRawPointerMatrix(matrix) assert(ptr == through_python) def test_modify_matrix(): ptr, matrix = aka.createMatrix(2, 3) matrix[0, :] = (1., 2., 3.) matrix2 = aka.getMatrix(ptr) assert(np.linalg.norm(matrix-matrix2) < 1e-15) for i in np.arange(1, 10): for j in np.arange(1, 10): ptr, matrix = aka.createMatrix(i, j) matrix[:, :] = np.random.random((i, j)) matrix2 = aka.getMatrix(ptr) assert(np.linalg.norm(matrix-matrix2) < 1e-15) def test_matrix_copy(): ptr, matrix = aka.createMatrix(10, 3) matrix2 = aka.copyMatrix(ptr) ptr2 = aka.getRawPointerMatrix(matrix2) assert(ptr != ptr2) @pytest.fixture def dcb_mesh(): geo_file = 'mesh_dcb_2d.geo' mesh_file = 'mesh_dcb_2d.msh' if os.path.exists(mesh_file): return mesh_file open(geo_file, 'w').write(""" //Mesh size dx = 57.8e-5; Point(1) = {0,0,0,dx}; Point(2) = {0,0.00055,0,dx}; Point(3) = {0,-0.00055,0,dx}; Point(4) = {57.8e-3,0,0,dx}; Point(5) = {57.8e-3,0.00055,0,dx}; Point(6) = {57.8e-3,-0.00055,0,dx}; Line(1) = {1, 2}; Line(2) = {2, 5}; Line(3) = {5, 4}; Line(4) = {1, 4}; Line(5) = {1, 3}; Line(6) = {6, 4}; Line(7) = {3, 6}; Line Loop(8) = {2, 3, -4, 1}; Plane Surface(9) = {-8}; Line Loop(10) = {5, 7, 6, -4}; Plane Surface(11) = {10}; Physical Surface("bulk") = {9,11}; Physical Line("coh") = {4}; Physical Line("edge") = {1}; Transfinite Surface "*"; Recombine Surface "*"; Mesh.SecondOrderIncomplete = 1; """) ret = subprocess.call( 'gmsh -format msh2 -2 {0} -o {1}'.format( geo_file, mesh_file), shell=True) if not ret == 0: raise Exception( 'execution of GMSH failed: do you have it installed ?') return mesh_file @pytest.fixture def elastic_material(): mat_file = 'elastic.dat' open(mat_file, 'w').write(""" material elastic [ name = bulk rho = 2500 nu = 0.22 E = 71e9 ] """) return mat_file def test_multiple_init(dcb_mesh, elastic_material): aka.parseInput(elastic_material) print('First initialisation') mesh = aka.Mesh(2) mesh.read(dcb_mesh) model = aka.SolidMechanicsModel(mesh) model.initFull(aka.SolidMechanicsModelOptions(aka._static)) del model del mesh print('Second initialisation') mesh = aka.Mesh(2) mesh.read(dcb_mesh) model = aka.SolidMechanicsModel(mesh) model.initFull(aka.SolidMechanicsModelOptions(aka._static)) del model del mesh print('All right') def test_boundary_condition_functors(dcb_mesh, elastic_material): class FixedValue(aka.DirichletFunctor): def __init__(self, value, axis): super().__init__(axis) self.value = value self.axis = int(axis) def __call__(self, node, flags, primal, coord): primal[self.axis] = self.value flags[self.axis] = True class FromStress(aka.NeumannFunctor): def __init__(self, stress): super().__init__() self.stress = stress def __call__(self, quad_point, dual, coord, normals): dual[:] = np.dot(self.stress, normals) aka.parseInput(elastic_material) mesh = aka.Mesh(2) mesh.read(dcb_mesh) model = aka.SolidMechanicsModel(mesh, 2) model.initFull() model.applyBC(FixedValue(0.0, aka._x), "edge") stress = np.array([[1, 0], [0, 0]]) blocked_nodes = mesh.getElementGroup("edge").getNodes().flatten() boundary = model.getBlockedDOFs() # Testing that nodes are correctly blocked for n in blocked_nodes: if not boundary[n, 0]: return -1 boundary.fill(False) model.applyBC(FromStress(stress), "edge") - force = model.getForce() + force = model.getExternalForce() # Checking that nodes have a force in the correct direction for n in blocked_nodes: if not force[n, 0] > 0: return -1 return 0