15#ifdef ENABLE_PYTHON_BINDING
18AnalyticalExprPython::analyticalExprInit(
const std::string py_file) {
23 auto main_module = bp::import(
"__main__");
24 mainNamespace = main_module.attr(
"__dict__");
25 bp::exec_file(py_file.c_str(), mainNamespace, mainNamespace);
27 analyticalDispFun = mainNamespace[
"analytical_disp"];
28 analyticalTractionFun = mainNamespace[
"analytical_traction"];
29 analyticalExternalStrainFun = mainNamespace[
"analytical_external_strain"];
30 analyticalElasticFun = mainNamespace[
"analytical_elastic"];
32 }
catch (bp::error_already_set
const &) {
42 double delta_t,
double t, np::ndarray x, np::ndarray y, np::ndarray z,
43 np::ndarray nx, np::ndarray ny, np::ndarray nz,
52 analyticalDispFun(delta_t,
t, x, y, z, nx, ny, nz, block_name));
54 }
catch (bp::error_already_set
const &) {
64 double delta_t,
double t, np::ndarray x, np::ndarray y, np::ndarray z,
65 np::ndarray nx, np::ndarray ny, np::ndarray nz,
74 analyticalTractionFun(delta_t,
t, x, y, z, nx, ny, nz, block_name));
76 }
catch (bp::error_already_set
const &) {
86 double delta_t,
double t, np::ndarray x, np::ndarray y, np::ndarray z,
95 analyticalExternalStrainFun(delta_t,
t, x, y, z, block_name));
97 }
catch (bp::error_already_set
const &) {
107 double delta_t,
double t, np::ndarray x, np::ndarray y, np::ndarray z,
116 analyticalElasticFun(delta_t,
t, x, y, z, block_name));
118 }
catch (bp::error_already_set
const &) {
126boost::weak_ptr<AnalyticalExprPython> AnalyticalExprPythonWeakPtr;
130np::ndarray convert_to_numpy(
VectorDouble &data,
int nb_gauss_pts,
int id) {
131 auto dtype = np::dtype::get_builtin<double>();
132 auto size = bp::make_tuple(nb_gauss_pts);
133 auto stride = bp::make_tuple(3 *
sizeof(
double));
134 return (np::from_data(&data[
id], dtype, size, stride, bp::object()));
145 const std::string block_name) {
147#ifdef ENABLE_PYTHON_BINDING
148 if (
auto analytical_expr_ptr = AnalyticalExprPythonWeakPtr.lock()) {
153 bp::list python_coords;
154 bp::list python_normals;
156 for (
int idx = 0; idx < 3; ++idx) {
157 python_coords.append(convert_to_numpy(v_ref_coords, nb_gauss_pts, idx));
158 python_normals.append(convert_to_numpy(v_ref_normals, nb_gauss_pts, idx));
161 auto disp_block_name =
"(.*)ANALYTICAL_DISPLACEMENT(.*)";
162 auto traction_block_name =
"(.*)ANALYTICAL_TRACTION(.*)";
164 std::regex reg_disp_name(disp_block_name);
165 std::regex reg_traction_name(traction_block_name);
167 np::ndarray np_analytical_expr = np::empty(
168 bp::make_tuple(nb_gauss_pts, 3), np::dtype::get_builtin<double>());
170 if (std::regex_match(block_name, reg_disp_name)) {
172 delta_t,
t, bp::extract<np::ndarray>(python_coords[0]),
173 bp::extract<np::ndarray>(python_coords[1]),
174 bp::extract<np::ndarray>(python_coords[2]),
175 bp::extract<np::ndarray>(python_normals[0]),
176 bp::extract<np::ndarray>(python_normals[1]),
177 bp::extract<np::ndarray>(python_normals[2]),
178 block_name, np_analytical_expr),
179 "Failed analytical_disp() python call");
180 }
else if (std::regex_match(block_name, reg_traction_name)) {
182 delta_t,
t, bp::extract<np::ndarray>(python_coords[0]),
183 bp::extract<np::ndarray>(python_coords[1]),
184 bp::extract<np::ndarray>(python_coords[2]),
185 bp::extract<np::ndarray>(python_normals[0]),
186 bp::extract<np::ndarray>(python_normals[1]),
187 bp::extract<np::ndarray>(python_normals[2]),
188 block_name, np_analytical_expr),
189 "Failed analytical_traction() python call");
192 "Unknown analytical block");
196 if (PetscUnlikely(np_analytical_expr.get_shape()[0] != nb_gauss_pts ||
197 np_analytical_expr.get_shape()[1] != 3)) {
200 "Wrong shape of analytical expression returned from "
201 "python, expected: (" +
202 std::to_string(nb_gauss_pts) +
", 3), got: (" +
203 std::to_string(np_analytical_expr.get_shape()[0]) +
", " +
204 std::to_string(np_analytical_expr.get_shape()[1]) +
")");
207 double *analytical_expr_val_ptr =
208 reinterpret_cast<double *
>(np_analytical_expr.get_data());
212 v_analytical_expr, nb_gauss_pts);
213 for (
size_t gg = 0; gg < nb_gauss_pts; ++gg) {
214 for (
int idx = 0; idx < 3; ++idx)
215 v_analytical_expr(gg, idx) =
216 *(analytical_expr_val_ptr + (3 * gg + idx));
218 return v_analytical_expr;
229 const std::string block_name) {
231#ifdef ENABLE_PYTHON_BINDING
232 if (
auto analytical_expr_ptr = AnalyticalExprPythonWeakPtr.lock()) {
236 bp::list python_coords;
238 for (
int idx = 0; idx < 3; ++idx) {
239 python_coords.append(convert_to_numpy(v_ref_coords, nb_gauss_pts, idx));
242 auto externalstrain_block_name =
"(.*)ANALYTICAL_EXTERNALSTRAIN(.*)";
244 std::regex reg_externalstrain_name(externalstrain_block_name);
246 np::ndarray np_analytical_expr = np::empty(
247 bp::make_tuple(nb_gauss_pts), np::dtype::get_builtin<double>());
249 if (std::regex_match(block_name, reg_externalstrain_name)) {
251 delta_t,
t, bp::extract<np::ndarray>(python_coords[0]),
252 bp::extract<np::ndarray>(python_coords[1]),
253 bp::extract<np::ndarray>(python_coords[2]), block_name,
255 "Failed analytical_external_strain() python call");
258 "Unknown analytical block");
262 if (PetscUnlikely(np_analytical_expr.get_shape()[0] != nb_gauss_pts ||
263 np_analytical_expr.get_shape()[1] != 1)) {
266 "Wrong shape of analytical expression returned from "
267 "python, expected: (" +
268 std::to_string(nb_gauss_pts) +
", 1), got: (" +
269 std::to_string(np_analytical_expr.get_shape()[0]) +
", " +
270 std::to_string(np_analytical_expr.get_shape()[1]) +
")");
273 double *analytical_expr_val_ptr =
274 reinterpret_cast<double *
>(np_analytical_expr.get_data());
277 v_analytical_expr.resize(nb_gauss_pts,
false);
278 for (
size_t gg = 0; gg < nb_gauss_pts; ++gg)
279 v_analytical_expr[gg] = *(analytical_expr_val_ptr + gg);
281 return v_analytical_expr;
292 const std::string block_name) {
293#ifdef ENABLE_PYTHON_BINDING
294 if (
auto analytical_expr_ptr = AnalyticalExprPythonWeakPtr.lock()) {
298 bp::list python_coords;
300 for (
int idx = 0; idx < 3; ++idx) {
301 python_coords.append(convert_to_numpy(v_ref_coords, nb_gauss_pts, idx));
304 auto analytical_elastic_block_name =
"(.*)ANALYTICAL_ELASTIC(.*)";
306 std::regex reg_youngs_modulus_name(analytical_elastic_block_name);
308 np::ndarray np_analytical_expr = np::empty(
309 bp::make_tuple(nb_gauss_pts), np::dtype::get_builtin<double>());
311 if (std::regex_match(block_name, reg_youngs_modulus_name)) {
313 delta_t,
t, bp::extract<np::ndarray>(python_coords[0]),
314 bp::extract<np::ndarray>(python_coords[1]),
315 bp::extract<np::ndarray>(python_coords[2]), block_name,
317 "Failed analytical_elastic() python call");
320 "Unknown analytical block");
324 if (PetscUnlikely(np_analytical_expr.get_shape()[0] != nb_gauss_pts ||
325 np_analytical_expr.get_shape()[1] != 1)) {
328 "Wrong shape of analytical expression returned from "
329 "python, expected: (" +
330 std::to_string(nb_gauss_pts) +
", 1), got: (" +
331 std::to_string(np_analytical_expr.get_shape()[0]) +
", " +
332 std::to_string(np_analytical_expr.get_shape()[1]) +
")");
335 double *analytical_expr_val_ptr =
336 reinterpret_cast<double *
>(np_analytical_expr.get_data());
339 v_analytical_expr.resize(nb_gauss_pts,
false);
340 for (
size_t gg = 0; gg < nb_gauss_pts; ++gg)
341 v_analytical_expr[gg] = *(analytical_expr_val_ptr + gg);
343 return v_analytical_expr;
Eshelbian plasticity interface.
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
@ MOFEM_OPERATION_UNSUCCESSFUL
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
VectorDouble analytical_externalstrain_function(double delta_t, double t, int nb_gauss_pts, MatrixDouble &m_ref_coords, const std::string block_name)
VectorDouble analytical_elastic_function(double delta_t, double t, int nb_gauss_pts, MatrixDouble &m_ref_coords, const std::string block_name)
MatrixDouble analytical_expr_function(double delta_t, double t, int nb_gauss_pts, MatrixDouble &m_ref_coords, MatrixDouble &m_ref_normals, const std::string block_name)
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
UBlasMatrix< double > MatrixDouble
UBlasVector< double > VectorDouble
implementation of Data Operators for Forces and Sources
decltype(GetFTensor1FromMatImpl< Tensor_Dim, S, DL, M >::get(std::declval< M & >(), 0, 0)) GetFTensor1FromMatType
constexpr double t
plate stiffness