From 84554dfb610a8389fc7b9ef1e3dd0260812c491f Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Mon, 14 Apr 2025 16:42:43 +0200 Subject: [PATCH 01/46] Create exception.hpp --- include/simcoon/exception.hpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100755 include/simcoon/exception.hpp diff --git a/include/simcoon/exception.hpp b/include/simcoon/exception.hpp new file mode 100755 index 000000000..ba30453c6 --- /dev/null +++ b/include/simcoon/exception.hpp @@ -0,0 +1,35 @@ +/* This file is part of simcoon. + + simcoon is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + simcoon is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with simcoon. If not, see . + + */ + +///@file exception.hpp +///@brief exceptions of simcoon +///@version 1.0 + +#pragma once + +#include +#include + +namespace simcoon { + +class exception_eig_sym : public std::runtime_error { +public: + explicit exception_eig_sym(const std::string& msg) + : std::runtime_error(msg) {} +}; + +} //namespace simcoon From f0baf73760e5c8b0a7b2680d96bb78a9efea6acc Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Mon, 14 Apr 2025 16:42:48 +0200 Subject: [PATCH 02/46] Update contimech.cpp --- .../Functions/contimech.cpp | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/src/Continuum_mechanics/Functions/contimech.cpp b/src/Continuum_mechanics/Functions/contimech.cpp index 2c3f1a626..9d662345a 100755 --- a/src/Continuum_mechanics/Functions/contimech.cpp +++ b/src/Continuum_mechanics/Functions/contimech.cpp @@ -355,28 +355,16 @@ mat p_ikjl(const vec &a) { mat auto_sym_dyadic(const mat &A) { //T vec A_v = t2v_sym(A); - mat C = zeros(6,6); - for (unsigned int i=0; i<6; i++) { - for (unsigned int j=0; j<6; j++) { - C(i,j) = A_v(i)*A_v(j); - } - } - return C; + return A_v * A_v.t(); } mat sym_dyadic(const mat &A, const mat &B) { vec A_v = t2v_sym(A); vec B_v = t2v_sym(B); - mat C = zeros(6,6); - - for (unsigned int i=0; i<6; i++) { - for (unsigned int j=0; j<6; j++) { - C(i,j) = A_v(i)*B_v(j); - } - } - return C; + + return = A_v * B_v.t(); } mat auto_dyadic(const mat &A) { From 1bddf8ee312191b7f87e8f903d416a6a8805bbad Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Mon, 14 Apr 2025 16:42:52 +0200 Subject: [PATCH 03/46] Update criteria.cpp --- src/Continuum_mechanics/Functions/criteria.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Continuum_mechanics/Functions/criteria.cpp b/src/Continuum_mechanics/Functions/criteria.cpp index d43708145..2e758fa9d 100755 --- a/src/Continuum_mechanics/Functions/criteria.cpp +++ b/src/Continuum_mechanics/Functions/criteria.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -103,9 +104,14 @@ vec dPrager_stress(const vec &v, const double &b, const double &n) double Tresca_stress(const vec &v) { mat sigma = v2t_stress(v); - vec lambda = eig_sym(sigma); - - //eig_sym is in ascending order + vec lambda; + try { + lambda = eig_sym(sigma); + } catch (const std::runtime_error &e) { + cerr << "Error in eig_sym: " << e.what() << endl; + throw simcoon::exception_eig_sym("Failed to compute eigenvalues in Tresca_stress."); + } + // eig_sym is in ascending order return lambda(2) - lambda(0); } From 6e88b6c065106cdc503827f77aeae9f129aa0cca Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Mon, 14 Apr 2025 16:42:55 +0200 Subject: [PATCH 04/46] Update hyperelastic.cpp --- .../Functions/hyperelastic.cpp | 45 ++++++++++++++++--- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/src/Continuum_mechanics/Functions/hyperelastic.cpp b/src/Continuum_mechanics/Functions/hyperelastic.cpp index b4f4be6c1..b1e9a1966 100755 --- a/src/Continuum_mechanics/Functions/hyperelastic.cpp +++ b/src/Continuum_mechanics/Functions/hyperelastic.cpp @@ -63,7 +63,13 @@ vec isochoric_pstretch_from_V(const mat &V, const double &mJ) { if (fabs(mJ) < sim_iota) { J = det(V); } - vec lambda = eig_sym(V); + vec lambda; + try { + lambda = eig_sym(V); + } catch (const std::runtime_error &e) { + cerr << "Error in eig_sym: " << e.what() << endl; + throw simcoon::exception_eig_sym("Failed to compute eigenvalues in isochoric_pstretch_from_V."); + } vec lambda_bar = pow(J,-1./3.)*lambda; return lambda_bar; } @@ -74,7 +80,13 @@ vec isochoric_pstretch_from_b(const mat &b, const double &mJ) { if (fabs(mJ) < sim_iota) { J = sqrt(det(b)); } - vec lambda = eig_sym(b); + vec lambda; + try { + lambda = eig_sym(b); + } catch (const std::runtime_error &e) { + cerr << "Error in eig_sym: " << e.what() << endl; + throw simcoon::exception_eig_sym("Failed to compute eigenvalues in isochoric_pstretch_from_b."); + } lambda.transform( [](double val) { return (sqrt(val)); } ); vec lambda_bar = pow(J,-1./3.)*lambda; return lambda_bar; @@ -97,14 +109,20 @@ void pstretch(vec &lambda, mat &n_pvector, const mat &input, const string &input if (fabs(mJ) < sim_iota) { J = sqrt(det(input)); } - eig_sym(lambda, n_pvector, input); + bool success_eig_sym = eig_sym(lambda, n_pvector, input); + if (!success_eig_sym) { + throw simcoon::exception_eig_sym("Error in eig_sym function inside pstretch."); + } lambda.transform( [](double val) { return (sqrt(val)); } ); } else if (input_tensor == "v" || input_tensor == "V") { if (fabs(mJ) < sim_iota) { J = det(input); } - eig_sym(lambda, n_pvector, input); + bool success_eig_sym = eig_sym(lambda, n_pvector, input); + if (!success_eig_sym) { + throw simcoon::exception_eig_sym("Error in eig_sym function inside pstretch."); + } } else { throw std::invalid_argument("Invalid input string to describe the input vector: it should be *b* for left Cauchy-Green tensor or *v* or *V* for Eulerian stretch tensor"); @@ -128,14 +146,20 @@ void isochoric_pstretch(vec &lambda_bar, mat &n_pvectors, const mat &input, cons if (fabs(mJ) < sim_iota) { J = sqrt(det(input)); } - eig_sym(lambda, n_pvectors, input); + bool success_eig_sym = eig_sym(lambda, n_pvector, input); + if (!success_eig_sym) { + throw simcoon::exception_eig_sym("Error in eig_sym function inside isochoric_pstretch."); + } lambda.transform( [](double val) { return (sqrt(val)); } ); } else if (input_tensor == "v" || input_tensor == "V") { if (fabs(mJ) < sim_iota) { J = det(input); } - eig_sym(lambda, n_pvectors, input); + bool success_eig_sym = eig_sym(lambda, n_pvector, input); + if (!success_eig_sym) { + throw simcoon::exception_eig_sym("Error in eig_sym function inside isochoric_pstretch."); + } } else { throw std::invalid_argument("Invalid input string to describe the input vector: it should be *b* for left Cauchy-Green tensor or *v* or *V* for Eulerian stretch tensor"); @@ -385,7 +409,14 @@ mat L_iso_hyper_pstretch(const vec &dWdlambda_bar, const mat &dW2dlambda_bar2, c if (fabs(mJ) < sim_iota) { J = sqrt(det(b)); } - vec lambda = eig_sym(b); + + vec lambda; + try { + lambda = eig_sym(b); + } catch (const std::runtime_error &e) { + cerr << "Error in eig_sym: " << e.what() << endl; + throw simcoon::exception_eig_sym("Failed to compute eigenvalues in L_iso_hyper_pstretch."); + } vec lambda_bar = zeros(3); vec n_pvectors = zeros(3); From c74d3b5a5bfe31c24678c8dbb9df74fd0a13d6e9 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Mon, 14 Apr 2025 16:42:58 +0200 Subject: [PATCH 05/46] Update objective_rates.cpp --- .../Functions/objective_rates.cpp | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/Continuum_mechanics/Functions/objective_rates.cpp b/src/Continuum_mechanics/Functions/objective_rates.cpp index 65bcb5bcf..0d30c2434 100755 --- a/src/Continuum_mechanics/Functions/objective_rates.cpp +++ b/src/Continuum_mechanics/Functions/objective_rates.cpp @@ -97,7 +97,11 @@ void logarithmic_R(mat &DR, mat &N_1, mat &N_2, mat &D, mat &Omega, const double vec bi = zeros(3); mat Bi; - eig_sym(bi, Bi, B); + bool success_eig_sym = eig_sym(bi, Bi, B); + if (!success_eig_sym) { + throw simcoon::exception_eig_sym("Error in eig_sym function inside logarithmic_R."); + } + std::vector Bi_proj(3); Bi_proj[0] = Bi.col(0)*(Bi.col(0)).t(); Bi_proj[1] = Bi.col(1)*(Bi.col(1)).t(); @@ -145,7 +149,10 @@ void logarithmic_F(mat &DF, mat &N_1, mat &N_2, mat &D, mat &L, const double &DT vec bi = zeros(3); mat Bi; - eig_sym(bi, Bi, B); + bool success_eig_sym = eig_sym(bi, Bi, B); + if (!success_eig_sym) { + throw simcoon::exception_eig_sym("Error in eig_sym function inside logarithmic_R."); + } std::vector Bi_proj(3); Bi_proj[0] = Bi.col(0)*(Bi.col(0)).t(); Bi_proj[1] = Bi.col(1)*(Bi.col(1)).t(); @@ -188,7 +195,10 @@ mat get_BBBB(const mat &F1) { vec bi = zeros(3); mat Bi; - eig_sym(bi, Bi, B); + bool success_eig_sym = eig_sym(bi, Bi, B); + if (!success_eig_sym) { + throw simcoon::exception_eig_sym("Error in eig_sym function inside logarithmic_R."); + } mat BBBB = zeros(6,6); double f_z = 0.; @@ -208,7 +218,10 @@ mat get_BBBB_GN(const mat &F1) { vec bi = zeros(3); mat Bi; - eig_sym(bi, Bi, B); + bool success_eig_sym = eig_sym(bi, Bi, B); + if (!success_eig_sym) { + throw simcoon::exception_eig_sym("Error in eig_sym function inside logarithmic_R."); + } mat BBBB = zeros(6,6); double f_z = 0.; @@ -240,7 +253,10 @@ void logarithmic(mat &DR, mat &D, mat &Omega, const double &DTime, const mat &F0 vec bi = zeros(3); mat Bi; - eig_sym(bi, Bi, B); + bool success_eig_sym = eig_sym(bi, Bi, B); + if (!success_eig_sym) { + throw simcoon::exception_eig_sym("Error in eig_sym function inside logarithmic_R."); + } std::vector Bi_proj(3); Bi_proj[0] = Bi.col(0)*(Bi.col(0)).t(); Bi_proj[1] = Bi.col(1)*(Bi.col(1)).t(); From 0699acfd8554e04661eb8d8329b8735af6d63afe Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Mon, 14 Apr 2025 16:43:00 +0200 Subject: [PATCH 06/46] Update SMA_mono.cpp --- .../Umat/Mechanical/SMA/SMA_mono.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp index 4af00c628..7d468e4b5 100644 --- a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp @@ -395,11 +395,10 @@ void umat_sma_mono(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, mat & Lt = L + ((L*lambda)*(inv(dPhidxi))*(dPhidsigma*L)); } else - Lt = L; - - vec eigval = eig_sym(Lt); + Lt = L; /* ///Note : To use with Self-consistent micromechanics only! + vec eigval = eig_sym(Lt); while(eigval(0) < 0.) { Lt = 0.99*Lt + 0.01*Lt_eff; eigval = eig_sym(Lt); @@ -414,9 +413,8 @@ void umat_sma_mono(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, mat & Lt = L; } - vec Dsigma = sigma - sigma_start; - vec eigval = eig_sym(Lt); - +// vec Dsigma = sigma - sigma_start; + /* if (compteur < 20) { tnew_dt = 2.; } From 3bf41d039ab73cf0c197404975b8eaec3124101d Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Mon, 14 Apr 2025 16:43:04 +0200 Subject: [PATCH 07/46] Update SMA_mono_cubic.cpp --- .../Umat/Mechanical/SMA/SMA_mono_cubic.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp index 541b5c4a7..50e83b6ef 100644 --- a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp @@ -400,11 +400,9 @@ void umat_sma_mono_cubic(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, } else Lt = L; - - vec eigval = eig_sym(Lt); - ///Note : To use with Self-consistent micromechanics only! -/* while(eigval(0) < 0.) { +/* vec eigval = eig_sym(Lt); + while(eigval(0) < 0.) { Lt = 0.99*Lt + 0.01*Lt_eff; eigval = eig_sym(Lt); } */ From de58f1058f0bdea2cea385b38fa22171aa725140 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Tue, 15 Apr 2025 08:38:20 +0200 Subject: [PATCH 08/46] Update contimech.cpp --- src/Continuum_mechanics/Functions/contimech.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Continuum_mechanics/Functions/contimech.cpp b/src/Continuum_mechanics/Functions/contimech.cpp index 9d662345a..fe81bad8d 100755 --- a/src/Continuum_mechanics/Functions/contimech.cpp +++ b/src/Continuum_mechanics/Functions/contimech.cpp @@ -364,7 +364,7 @@ mat sym_dyadic(const mat &A, const mat &B) { vec A_v = t2v_sym(A); vec B_v = t2v_sym(B); - return = A_v * B_v.t(); + return A_v * B_v.t(); } mat auto_dyadic(const mat &A) { From 2232f3d43f7480be3b97e0f0d67b7c227c1098bd Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Tue, 15 Apr 2025 15:29:05 +0200 Subject: [PATCH 09/46] add exception.hpp --- .../Libraries/Continuum_mechanics/hyperelastic.cpp | 3 +-- src/Continuum_mechanics/Functions/hyperelastic.cpp | 1 + src/Continuum_mechanics/Functions/objective_rates.cpp | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/simcoon-python-builder/src/python_wrappers/Libraries/Continuum_mechanics/hyperelastic.cpp b/simcoon-python-builder/src/python_wrappers/Libraries/Continuum_mechanics/hyperelastic.cpp index b644edbb1..bedbbbe5d 100755 --- a/simcoon-python-builder/src/python_wrappers/Libraries/Continuum_mechanics/hyperelastic.cpp +++ b/simcoon-python-builder/src/python_wrappers/Libraries/Continuum_mechanics/hyperelastic.cpp @@ -4,8 +4,7 @@ #include #include - - +#include #include #include #include diff --git a/src/Continuum_mechanics/Functions/hyperelastic.cpp b/src/Continuum_mechanics/Functions/hyperelastic.cpp index b1e9a1966..17d94607c 100755 --- a/src/Continuum_mechanics/Functions/hyperelastic.cpp +++ b/src/Continuum_mechanics/Functions/hyperelastic.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include diff --git a/src/Continuum_mechanics/Functions/objective_rates.cpp b/src/Continuum_mechanics/Functions/objective_rates.cpp index 0d30c2434..ce8e95443 100755 --- a/src/Continuum_mechanics/Functions/objective_rates.cpp +++ b/src/Continuum_mechanics/Functions/objective_rates.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include From 397a21bcddae7dd095d47f8cacd6c241c4ed0221 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Tue, 15 Apr 2025 15:34:13 +0200 Subject: [PATCH 10/46] Update hyperelastic.cpp --- .../Functions/hyperelastic.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Continuum_mechanics/Functions/hyperelastic.cpp b/src/Continuum_mechanics/Functions/hyperelastic.cpp index 17d94607c..64092d5ee 100755 --- a/src/Continuum_mechanics/Functions/hyperelastic.cpp +++ b/src/Continuum_mechanics/Functions/hyperelastic.cpp @@ -103,14 +103,14 @@ vec isochoric_pstretch(const mat &input, const string &input_tensor, const doubl throw std::invalid_argument("Invalid input string to describe the input vector: it should be *b* for left Cauchy-Green tensor or *v* or *V* for Eulerian stretch tensor"); } -void pstretch(vec &lambda, mat &n_pvector, const mat &input, const string &input_tensor, const double &mJ) { +void pstretch(vec &lambda, mat &n_pvectors, const mat &input, const string &input_tensor, const double &mJ) { double J=mJ; if (input_tensor == "b") { if (fabs(mJ) < sim_iota) { J = sqrt(det(input)); } - bool success_eig_sym = eig_sym(lambda, n_pvector, input); + bool success_eig_sym = eig_sym(lambda, n_pvectors, input); if (!success_eig_sym) { throw simcoon::exception_eig_sym("Error in eig_sym function inside pstretch."); } @@ -120,7 +120,7 @@ void pstretch(vec &lambda, mat &n_pvector, const mat &input, const string &input if (fabs(mJ) < sim_iota) { J = det(input); } - bool success_eig_sym = eig_sym(lambda, n_pvector, input); + bool success_eig_sym = eig_sym(lambda, n_pvectors, input); if (!success_eig_sym) { throw simcoon::exception_eig_sym("Error in eig_sym function inside pstretch."); } @@ -130,12 +130,12 @@ void pstretch(vec &lambda, mat &n_pvector, const mat &input, const string &input } } -void pstretch(vec &lambda, mat &n_pvector, std::vector &N_projectors, const mat &input, const string &input_tensor, const double &mJ) { +void pstretch(vec &lambda, mat &n_pvectors, std::vector &N_projectors, const mat &input, const string &input_tensor, const double &mJ) { - pstretch(lambda, n_pvector, input, input_tensor, mJ); - N_projectors[0] = n_pvector.col(0)*(n_pvector.col(0)).t(); - N_projectors[1] = n_pvector.col(1)*(n_pvector.col(1)).t(); - N_projectors[2] = n_pvector.col(2)*(n_pvector.col(2)).t(); + pstretch(lambda, n_pvectors, input, input_tensor, mJ); + N_projectors[0] = n_pvectors.col(0)*(n_pvectors.col(0)).t(); + N_projectors[1] = n_pvectors.col(1)*(n_pvectors.col(1)).t(); + N_projectors[2] = n_pvectors.col(2)*(n_pvectors.col(2)).t(); } void isochoric_pstretch(vec &lambda_bar, mat &n_pvectors, const mat &input, const string &input_tensor, const double &mJ) { @@ -147,7 +147,7 @@ void isochoric_pstretch(vec &lambda_bar, mat &n_pvectors, const mat &input, cons if (fabs(mJ) < sim_iota) { J = sqrt(det(input)); } - bool success_eig_sym = eig_sym(lambda, n_pvector, input); + bool success_eig_sym = eig_sym(lambda, n_pvectors, input); if (!success_eig_sym) { throw simcoon::exception_eig_sym("Error in eig_sym function inside isochoric_pstretch."); } @@ -157,7 +157,7 @@ void isochoric_pstretch(vec &lambda_bar, mat &n_pvectors, const mat &input, cons if (fabs(mJ) < sim_iota) { J = det(input); } - bool success_eig_sym = eig_sym(lambda, n_pvector, input); + bool success_eig_sym = eig_sym(lambda, n_pvectors, input); if (!success_eig_sym) { throw simcoon::exception_eig_sym("Error in eig_sym function inside isochoric_pstretch."); } From b314549d3b3564b4a56bf16fd9f8ade26b05a068 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Wed, 16 Apr 2025 08:56:07 +0200 Subject: [PATCH 11/46] Update boostpython_smartplus_wrappers.cpp --- .../src/python_wrappers/boostpython_smartplus_wrappers.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/simcoon-python-builder/src/python_wrappers/boostpython_smartplus_wrappers.cpp b/simcoon-python-builder/src/python_wrappers/boostpython_smartplus_wrappers.cpp index d9d910a49..7ead71cd6 100755 --- a/simcoon-python-builder/src/python_wrappers/boostpython_smartplus_wrappers.cpp +++ b/simcoon-python-builder/src/python_wrappers/boostpython_smartplus_wrappers.cpp @@ -3,6 +3,8 @@ #include #include +#include + #include #include #include @@ -41,6 +43,10 @@ using namespace pybind11::literals; PYBIND11_MODULE(simmit, m) { m.doc() = "pybind11 example plugin"; // optional module docstring + // Register the exception translator + py::register_exception(m, "CppRuntimeError"); + py::register_exception(m, "CppExceptionEigSym"); + // Register the from-python converters for constitutive.hpp m.def("Ireal", &Ireal, "copy"_a=true, "Returns the fourth order identity tensor written in Voigt notation Ireal"); m.def("Ivol", &Ivol, "copy"_a=true, "Returns the volumic of the identity tensor Ireal written in Voigt notation"); From 19c2b166eb6dc81ec52c6f35295e1a26a0d5af32 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Wed, 16 Apr 2025 08:57:51 +0200 Subject: [PATCH 12/46] Update boostpython_smartplus_wrappers.cpp --- .../src/python_wrappers/boostpython_smartplus_wrappers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simcoon-python-builder/src/python_wrappers/boostpython_smartplus_wrappers.cpp b/simcoon-python-builder/src/python_wrappers/boostpython_smartplus_wrappers.cpp index 7ead71cd6..8df307763 100755 --- a/simcoon-python-builder/src/python_wrappers/boostpython_smartplus_wrappers.cpp +++ b/simcoon-python-builder/src/python_wrappers/boostpython_smartplus_wrappers.cpp @@ -45,7 +45,7 @@ PYBIND11_MODULE(simmit, m) { // Register the exception translator py::register_exception(m, "CppRuntimeError"); - py::register_exception(m, "CppExceptionEigSym"); + py::register_exception(m, "CppExceptionEigSym"); // Register the from-python converters for constitutive.hpp m.def("Ireal", &Ireal, "copy"_a=true, "Returns the fourth order identity tensor written in Voigt notation Ireal"); From 894067d51689cd0a080d607c852f1b6f284643a4 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Thu, 17 Apr 2025 11:11:27 +0200 Subject: [PATCH 13/46] replace sim_ with simcoon:: --- .../Functions/contimech.hpp | 2 +- .../Functions/recovery_props.hpp | 2 +- .../Continuum_mechanics/Material/ODF.hpp | 2 +- include/simcoon/parameter.hpp | 67 ++++++----------- software/ODF.cpp | 2 +- software/PDF.cpp | 2 +- .../Functions/contimech.cpp | 4 +- .../Functions/criteria.cpp | 4 +- .../Functions/hyperelastic.cpp | 36 +++++----- .../Functions/objective_rates.cpp | 16 ++--- .../Functions/recovery_props.cpp | 10 +-- src/Continuum_mechanics/Functions/stress.cpp | 34 ++++----- .../Homogenization/eshelby.cpp | 14 ++-- src/Continuum_mechanics/Material/ODF.cpp | 4 +- .../Material/ODF2Nphases.cpp | 8 +-- src/Continuum_mechanics/Material/peak.cpp | 10 +-- src/Continuum_mechanics/Material/read.cpp | 6 +- .../Umat/Finite/generic_hyper_invariants.cpp | 2 +- .../Combined/Prony_Nfast_Plastic.cpp | 8 +-- .../Umat/Mechanical/Damage/damage_LLD_0.cpp | 38 +++++----- .../Umat/Mechanical/Damage/damage_weibull.cpp | 6 +- .../Plasticity/Ani_chaboche_ccp.cpp | 6 +- .../Plasticity/DFA_chaboche_ccp.cpp | 6 +- .../Plasticity/Generic_chaboche_ccp.cpp | 6 +- .../Plasticity/Hill_chaboche_ccp.cpp | 6 +- .../Umat/Mechanical/Plasticity/Hill_isoh.cpp | 6 +- .../Mechanical/Plasticity/Hill_isoh_Nfast.cpp | 6 +- .../Plasticity/plastic_chaboche_ccp.cpp | 6 +- .../Plasticity/plastic_isotropic_ccp.cpp | 6 +- .../Plasticity/plastic_kin_iso_ccp.cpp | 6 +- .../Umat/Mechanical/SMA/SMA_mono.cpp | 2 +- .../Umat/Mechanical/SMA/SMA_mono_cubic.cpp | 2 +- .../Umat/Mechanical/SMA/unified_T.cpp | 4 +- .../Viscoelasticity/Prony_Nfast.cpp | 4 +- .../Viscoelasticity/Zener_Nfast.cpp | 4 +- .../Mechanical/Viscoelasticity/Zener_fast.cpp | 4 +- .../Plasticity/plastic_isotropic_ccp.cpp | 6 +- .../Plasticity/plastic_kin_iso_ccp.cpp | 6 +- .../Umat/Thermomechanical/SMA/unified_T.cpp | 4 +- .../Viscoelasticity/Prony_Nfast.cpp | 4 +- .../Viscoelasticity/Zener_Nfast.cpp | 4 +- .../Viscoelasticity/Zener_fast.cpp | 4 +- src/Continuum_mechanics/Umat/umat_smart.cpp | 4 +- .../Identification/identification.cpp | 2 +- src/Simulation/Identification/optimize.cpp | 4 +- src/Simulation/Maths/num_solve.cpp | 10 +-- src/Simulation/Maths/rotation.cpp | 72 +++++++++---------- src/Simulation/Maths/stats.cpp | 10 +-- src/Simulation/Phase/read.cpp | 42 +++++------ src/Simulation/Phase/state_variables.cpp | 12 ++-- src/Simulation/Phase/state_variables_M.cpp | 12 ++-- src/Simulation/Phase/state_variables_T.cpp | 12 ++-- src/Simulation/Phase/write.cpp | 42 +++++------ src/Simulation/Solver/read.cpp | 10 +-- src/Simulation/Solver/solver.cpp | 12 ++-- src/Simulation/Solver/step_meca.cpp | 4 +- src/Simulation/Solver/step_thermomeca.cpp | 4 +- test/Identification/Tidentification.cpp | 2 +- .../Continuum_mechanics/Tcontimech.cpp | 60 ++++++++-------- .../Continuum_mechanics/Tcriteria.cpp | 4 +- .../Continuum_mechanics/Tobjective_rates.cpp | 4 +- .../Continuum_mechanics/Ttransfer.cpp | 24 +++---- test/Libraries/Maths/Trotation.cpp | 12 ++-- 63 files changed, 356 insertions(+), 381 deletions(-) diff --git a/include/simcoon/Continuum_mechanics/Functions/contimech.hpp b/include/simcoon/Continuum_mechanics/Functions/contimech.hpp index 0d5b206de..e6e4e225c 100755 --- a/include/simcoon/Continuum_mechanics/Functions/contimech.hpp +++ b/include/simcoon/Continuum_mechanics/Functions/contimech.hpp @@ -488,7 +488,7 @@ arma::mat sym_dyadic_operator(const arma::mat &a, const arma::mat &b); double f_z = 0.; for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { - if ((i!=j)&&(fabs(bi(i)-bi(j))>sim_iota)) { + if ((i!=j)&&(fabs(bi(i)-bi(j))>simcoon::iota)) { f_z = (1.+(bi(i)/bi(j)))/(1.-(bi(i)/bi(j)))+2./log(bi(i)/bi(j)); BBBB = BBBB + f_z*B_klmn(Bi.col(i),Bi.col(j)); } diff --git a/include/simcoon/Continuum_mechanics/Functions/recovery_props.hpp b/include/simcoon/Continuum_mechanics/Functions/recovery_props.hpp index 0f231f181..1fc6b430b 100755 --- a/include/simcoon/Continuum_mechanics/Functions/recovery_props.hpp +++ b/include/simcoon/Continuum_mechanics/Functions/recovery_props.hpp @@ -38,7 +38,7 @@ namespace simcoon{ * @param[out] axis : The axis of symmetry (if applicable) * @param[out] props : The material properties vector * @param[out] maj_sym : The major symmetry condition (L_ij = L_ji ?). - * @param[in] tol : The tolerance utilized to check the symetries. If less than the global sim_limit (1.E-8), sim_limit is utilized. Default is 0. (so sim_limit is utilized by default) + * @param[in] tol : The tolerance utilized to check the symetries. If less than the global simcoon::limit (1.E-8), simcoon::limit is utilized. Default is 0. (so simcoon::limit is utilized by default) * * Material Symmetries considered: * diff --git a/include/simcoon/Continuum_mechanics/Material/ODF.hpp b/include/simcoon/Continuum_mechanics/Material/ODF.hpp index 5cd4c6b92..f7d57d10a 100755 --- a/include/simcoon/Continuum_mechanics/Material/ODF.hpp +++ b/include/simcoon/Continuum_mechanics/Material/ODF.hpp @@ -52,7 +52,7 @@ class ODF arma::vec limits; //minimal and maximal angles of orientation ODF(); //default constructor - ODF(const int &, const bool & = false, const double & = 0., const double & = sim_pi); //Partial constructor + ODF(const int &, const bool & = false, const double & = 0., const double & = simcoon::pi); //Partial constructor ODF(const int &, const int &, const int &, const std::vector &, const double &, const arma::vec &, const arma::vec &, const bool & = false); //Full constructor ODF(const ODF&); //Copy constructor diff --git a/include/simcoon/parameter.hpp b/include/simcoon/parameter.hpp index 4384a456b..11090663a 100755 --- a/include/simcoon/parameter.hpp +++ b/include/simcoon/parameter.hpp @@ -19,7 +19,11 @@ ///@brief parameters of simcoon ///@version 1.0 -#include +#if __has_include() + #include + #define HAS_STD_NUMBERS +#endif + #define UNUSED(x) [&x]{}() #ifndef version_full @@ -28,56 +32,27 @@ namespace simcoon{ -#ifndef sim_pi -#define sim_pi std::numbers::pi +#ifdef HAS_STD_NUMBERS + constexpr double pi = std::numbers::pi; +#else + constexpr double pi = 3.14159265358979323846; #endif -#ifndef axis_psi -#define axis_psi 3 -#endif +constexpr axis_psi 3 +constexpr axis_theta 1 +constexpr axis_phi 3 -#ifndef axis_theta -#define axis_theta 1 -#endif +constexpr sim_limit 1.E-9 +constexpr sim_iota 1.E-12 +constexpr miniter_umat 10 -#ifndef axis_phi -#define axis_phi 3 -#endif +constexpr maxiter_umat 100 +constexpr precision_umat 1E-9 -#ifndef sim_limit -#define sim_limit 1.E-9 -#endif +constexpr div_tnew_dt_umat 0.2 +constexpr mul_tnew_dt_umat 2 +constexpr maxiter_micro 100 -#ifndef sim_iota -#define sim_iota 1.E-12 -#endif - -#ifndef miniter_umat -#define miniter_umat 10 -#endif - -#ifndef maxiter_umat -#define maxiter_umat 100 -#endif - -#ifndef precision_umat -#define precision_umat 1E-9 -#endif - -#ifndef div_tnew_dt_umat -#define div_tnew_dt_umat 0.2 -#endif - -#ifndef mul_tnew_dt_umat -#define mul_tnew_dt_umat 2 -#endif - -#ifndef maxiter_micro -#define maxiter_micro 100 -#endif - -#ifndef precision_micro -#define precision_micro 1E-6 -#endif +constexpr precision_micro 1E-6 } //namespace simcoon diff --git a/software/ODF.cpp b/software/ODF.cpp index 1e13f4af9..1569c1993 100755 --- a/software/ODF.cpp +++ b/software/ODF.cpp @@ -107,7 +107,7 @@ int main() { string npeaksfile = "Npeaks" + to_string(int(num_file_npeaks)) + ".dat"; read_peak(odf_rve, path_data, npeaksfile); - vec x = linspace(angle_min, angle_max-sim_iota, 90); + vec x = linspace(angle_min, angle_max-simcoon::iota, 90); cout << "x = " << x.t() << endl; vec y = get_densities_ODF(x, path_data, "Npeaks0.dat", false); diff --git a/software/PDF.cpp b/software/PDF.cpp index e2f0ee489..13c86eb4f 100755 --- a/software/PDF.cpp +++ b/software/PDF.cpp @@ -103,7 +103,7 @@ int main() { string npeaksfile = "Npeaks" + to_string(int(num_file_npeaks)) + ".dat"; read_peak(pdf_rve, path_data, npeaksfile); - vec x = linspace(parameter_min, parameter_max-sim_iota, 100 ); + vec x = linspace(parameter_min, parameter_max-simcoon::iota, 100 ); cout << "x = " << x.t() << endl; vec y = get_densities_PDF(x, path_data, npeaksfile); diff --git a/src/Continuum_mechanics/Functions/contimech.cpp b/src/Continuum_mechanics/Functions/contimech.cpp index fe81bad8d..91bc584ea 100755 --- a/src/Continuum_mechanics/Functions/contimech.cpp +++ b/src/Continuum_mechanics/Functions/contimech.cpp @@ -257,9 +257,9 @@ double Macaulay_n(const double &d) { //This function returns the value if it's negative, zero if it's positive (Macaulay brackets <>-) double sign(const double &d) { - if ((d < sim_iota)&&(fabs(d) > sim_iota)) + if ((d < simcoon::iota)&&(fabs(d) > simcoon::iota)) return -1.; - else if(d > sim_iota) + else if(d > simcoon::iota) return 1.; else return 0.; diff --git a/src/Continuum_mechanics/Functions/criteria.cpp b/src/Continuum_mechanics/Functions/criteria.cpp index 2e758fa9d..e58a7d4b8 100755 --- a/src/Continuum_mechanics/Functions/criteria.cpp +++ b/src/Continuum_mechanics/Functions/criteria.cpp @@ -193,7 +193,7 @@ mat P_DFA(const vec ¶ms) { //Deshpande–Fleck–Ashby double Eq_stress_P(const vec &v, const mat &H) { - if (norm(v,2) > sim_iota) { + if (norm(v,2) > simcoon::iota) { return pow(sum(v%(H*v)),0.5); } else { @@ -203,7 +203,7 @@ double Eq_stress_P(const vec &v, const mat &H) { vec dEq_stress_P(const vec &v, const mat &H) { - if (norm(v,2) > sim_iota) { + if (norm(v,2) > simcoon::iota) { return (H*v)/Eq_stress_P(v,H); } else { diff --git a/src/Continuum_mechanics/Functions/hyperelastic.cpp b/src/Continuum_mechanics/Functions/hyperelastic.cpp index 64092d5ee..2c8b9e0b4 100755 --- a/src/Continuum_mechanics/Functions/hyperelastic.cpp +++ b/src/Continuum_mechanics/Functions/hyperelastic.cpp @@ -34,7 +34,7 @@ namespace simcoon{ vec isochoric_invariants(const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } mat b_bar = pow(J,-2./3.)*b; @@ -48,7 +48,7 @@ vec isochoric_invariants(const mat &b, const double &mJ) { vec isochoric_invariants(const vec &lambda, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = prod(lambda); } vec lambda_bar = pow(J,-1./3.)*lambda; @@ -61,7 +61,7 @@ vec isochoric_invariants(const vec &lambda, const double &mJ) { vec isochoric_pstretch_from_V(const mat &V, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = det(V); } vec lambda; @@ -78,7 +78,7 @@ vec isochoric_pstretch_from_V(const mat &V, const double &mJ) { vec isochoric_pstretch_from_b(const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } vec lambda; @@ -107,7 +107,7 @@ void pstretch(vec &lambda, mat &n_pvectors, const mat &input, const string &inpu double J=mJ; if (input_tensor == "b") { - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(input)); } bool success_eig_sym = eig_sym(lambda, n_pvectors, input); @@ -117,7 +117,7 @@ void pstretch(vec &lambda, mat &n_pvectors, const mat &input, const string &inpu lambda.transform( [](double val) { return (sqrt(val)); } ); } else if (input_tensor == "v" || input_tensor == "V") { - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = det(input); } bool success_eig_sym = eig_sym(lambda, n_pvectors, input); @@ -144,7 +144,7 @@ void isochoric_pstretch(vec &lambda_bar, mat &n_pvectors, const mat &input, cons vec lambda = zeros(3); if (input_tensor == "b") { - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(input)); } bool success_eig_sym = eig_sym(lambda, n_pvectors, input); @@ -154,7 +154,7 @@ void isochoric_pstretch(vec &lambda_bar, mat &n_pvectors, const mat &input, cons lambda.transform( [](double val) { return (sqrt(val)); } ); } else if (input_tensor == "v" || input_tensor == "V") { - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = det(input); } bool success_eig_sym = eig_sym(lambda, n_pvectors, input); @@ -228,7 +228,7 @@ mat tau_iso_hyper_pstretch(const vec &dWdlambda_bar, const vec &lambda_bar, cons mat sigma_iso_hyper_pstretch(const vec &dWdlambda_bar, const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } vec lambda_bar = zeros(3); @@ -289,7 +289,7 @@ vec delta_coefs(const vec &a_coefs, const vec &b_coefs, const mat &b) { mat tau_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_bar, const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } mat b_bar = pow(J,-2./3.)*b; @@ -299,7 +299,7 @@ mat tau_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_bar, mat tau_vol_hyper(const double &dUdJ, const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } mat Id = eye(3,3); @@ -308,7 +308,7 @@ mat tau_vol_hyper(const double &dUdJ, const mat &b, const double &mJ) { mat sigma_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_bar, const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } mat b_bar = pow(J,-2./3.)*b; @@ -318,7 +318,7 @@ mat sigma_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_ba mat sigma_vol_hyper(const double &dUdJ, const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } mat Id = eye(3,3); @@ -327,7 +327,7 @@ mat sigma_vol_hyper(const double &dUdJ, const mat &b, const double &mJ) { /*mat L_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_bar, const double &dW2dI_11_bar, const double &dW2dI_12_bar, const double &dW2dI_22_bar, const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } mat b_bar = pow(J,-2./3.)*b; @@ -353,7 +353,7 @@ mat sigma_vol_hyper(const double &dUdJ, const mat &b, const double &mJ) { /*mat L_iso_hyper_invariants(const vec &delta_coefs, const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } mat b_bar = pow(J,-2./3.)*b; @@ -407,7 +407,7 @@ mat L_iso_hyper_pstretch(const vec &dWdlambda_bar, const mat &dW2dlambda_bar2, c mat L_iso_hyper_pstretch(const vec &dWdlambda_bar, const mat &dW2dlambda_bar2, const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } @@ -452,7 +452,7 @@ mat L_iso_hyper_pstretch(const vec &dWdlambda_bar, const mat &dW2dlambda_bar2, c mat L_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_bar, const double &dW2dI_11_bar, const double &dW2dI_12_bar, const double &dW2dI_22_bar, const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } mat b_bar = pow(J,-2./3.)*b; @@ -477,7 +477,7 @@ mat L_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_bar, c mat L_vol_hyper(const double &dUdJ, const double &dU2dJ2, const mat &b, const double &mJ) { double J=mJ; - if (fabs(mJ) < sim_iota) { + if (fabs(mJ) < simcoon::iota) { J = sqrt(det(b)); } return (dUdJ+dU2dJ2*J)*3.*Ivol() - 2.*dUdJ*Ireal(); diff --git a/src/Continuum_mechanics/Functions/objective_rates.cpp b/src/Continuum_mechanics/Functions/objective_rates.cpp index ce8e95443..f6049e999 100755 --- a/src/Continuum_mechanics/Functions/objective_rates.cpp +++ b/src/Continuum_mechanics/Functions/objective_rates.cpp @@ -111,7 +111,7 @@ void logarithmic_R(mat &DR, mat &N_1, mat &N_2, mat &D, mat &Omega, const double N_1 = zeros(3,3); for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { - if ((i!=j)&&(fabs(bi(i)-bi(j))>sim_iota)) { + if ((i!=j)&&(fabs(bi(i)-bi(j))>simcoon::iota)) { N_1+=((1.+(bi(i)/bi(j)))/(1.-(bi(i)/bi(j)))+2./log(bi(i)/bi(j)))*Bi_proj[i]*D*Bi_proj[j]; } } @@ -120,7 +120,7 @@ void logarithmic_R(mat &DR, mat &N_1, mat &N_2, mat &D, mat &Omega, const double N_2 = zeros(3,3); for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { - if ((i!=j)&&(fabs(bi(i)-bi(j))>sim_iota)) { + if ((i!=j)&&(fabs(bi(i)-bi(j))>simcoon::iota)) { N_2+=((1.-(pow(bi(i)/bi(j),0.5)))/(1.+(pow(bi(i)/bi(j),0.5))))*Bi_proj[i]*D*Bi_proj[j]; } } @@ -162,7 +162,7 @@ void logarithmic_F(mat &DF, mat &N_1, mat &N_2, mat &D, mat &L, const double &DT N_1 = zeros(3,3); for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { - if ((i!=j)&&(fabs(bi(i)-bi(j))>sim_iota)) { + if ((i!=j)&&(fabs(bi(i)-bi(j))>simcoon::iota)) { N_1+=((1.+(bi(i)/bi(j)))/(1.-(bi(i)/bi(j)))+2./log(bi(i)/bi(j)))*Bi_proj[i]*D*Bi_proj[j]; } } @@ -171,7 +171,7 @@ void logarithmic_F(mat &DF, mat &N_1, mat &N_2, mat &D, mat &L, const double &DT N_2 = zeros(3,3); for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { - if ((i!=j)&&(fabs(bi(i)-bi(j))>sim_iota)) { + if ((i!=j)&&(fabs(bi(i)-bi(j))>simcoon::iota)) { N_2+=((1.-(pow(bi(i)/bi(j),0.5)))/(1.+(pow(bi(i)/bi(j),0.5))))*Bi_proj[i]*D*Bi_proj[j]; } } @@ -205,7 +205,7 @@ mat get_BBBB(const mat &F1) { double f_z = 0.; for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { - if ((i!=j)&&(fabs(bi(i)-bi(j))>sim_iota)) { + if ((i!=j)&&(fabs(bi(i)-bi(j))>simcoon::iota)) { f_z = (1.+(bi(i)/bi(j)))/(1.-(bi(i)/bi(j)))+2./log(bi(i)/bi(j)); BBBB = BBBB + f_z*B_klmn(Bi.col(i),Bi.col(j)); } @@ -228,7 +228,7 @@ mat get_BBBB_GN(const mat &F1) { double f_z = 0.; for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { - if ((i!=j)&&(fabs(bi(i)-bi(j))>sim_iota)) { + if ((i!=j)&&(fabs(bi(i)-bi(j))>simcoon::iota)) { f_z = (sqrt(bi(j)) - sqrt(bi(i)))/(sqrt(bi(j)) + sqrt(bi(i))); BBBB = BBBB + f_z*B_klmn(Bi.col(i),Bi.col(j)); } @@ -241,7 +241,7 @@ void logarithmic(mat &DR, mat &D, mat &Omega, const double &DTime, const mat &F0 mat I = eye(3,3); mat L = zeros(3,3); - if(DTime > sim_iota) { + if(DTime > simcoon::iota) { L = (1./DTime)*(F1-F0)*inv(F1); } @@ -266,7 +266,7 @@ void logarithmic(mat &DR, mat &D, mat &Omega, const double &DTime, const mat &F0 mat N = zeros(3,3); for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { - if ((i!=j)&&(fabs(bi(i)-bi(j))>sim_iota)) { + if ((i!=j)&&(fabs(bi(i)-bi(j))>simcoon::iota)) { N+=((1.+(bi(i)/bi(j)))/(1.-(bi(i)/bi(j)))+2./log(bi(i)/bi(j)))*Bi_proj[i]*D*Bi_proj[j]; } } diff --git a/src/Continuum_mechanics/Functions/recovery_props.cpp b/src/Continuum_mechanics/Functions/recovery_props.cpp index 4c5f6a0ea..48dd872cc 100755 --- a/src/Continuum_mechanics/Functions/recovery_props.cpp +++ b/src/Continuum_mechanics/Functions/recovery_props.cpp @@ -34,9 +34,9 @@ namespace simcoon{ void check_symetries(const mat &L, std::string &umat_type, int &axis, vec &props, int &maj_sym, const double &tol) { - double max_tol_sim_limit = sim_limit; - if(tol > sim_limit) { - max_tol_sim_limit = tol; + double max_tol_simcoon::limit = simcoon::limit; + if(tol > simcoon::limit) { + max_tol_simcoon::limit = tol; } axis = 0; //Indicate no preferential axis @@ -92,14 +92,14 @@ void check_symetries(const mat &L, std::string &umat_type, int &axis, vec &props for (unsigned int i=0; isim_iota) { + while(fabs(z-z1)>simcoon::iota) { p1 = 1.; p2 = 0.; diff --git a/src/Continuum_mechanics/Material/ODF.cpp b/src/Continuum_mechanics/Material/ODF.cpp index 8c777f22c..d66837eab 100755 --- a/src/Continuum_mechanics/Material/ODF.cpp +++ b/src/Continuum_mechanics/Material/ODF.cpp @@ -70,8 +70,8 @@ ODF::ODF(const int &nAngle, const bool &nradian, const double &angle_min, const limits(1) = angle_max; if (radian == false) { - limits(0) *= (sim_pi/180.); - limits(1) *= (sim_pi/180.); + limits(0) *= (simcoon::pi/180.); + limits(1) *= (simcoon::pi/180.); } } diff --git a/src/Continuum_mechanics/Material/ODF2Nphases.cpp b/src/Continuum_mechanics/Material/ODF2Nphases.cpp index 50bc04816..c86a2ca79 100755 --- a/src/Continuum_mechanics/Material/ODF2Nphases.cpp +++ b/src/Continuum_mechanics/Material/ODF2Nphases.cpp @@ -47,12 +47,12 @@ vec get_densities_ODF(const vec &x, const string &path_data, const string &input vec y = zeros(x.n_elem); vec x_rad; if (!radian) { - x_rad = x*(sim_pi/180.); + x_rad = x*(simcoon::pi/180.); if(x_rad.min() < 0.) { cout << "Error : x.min() < 0. Please provide an angle vector with all angles >=0."; return y; } - if(x_rad.max() > sim_pi) { + if(x_rad.max() > simcoon::pi) { cout << "Error : x.max() > pi Please provide an angle vector with all angles <=pi/180"; return y; } @@ -62,7 +62,7 @@ vec get_densities_ODF(const vec &x, const string &path_data, const string &input cout << "Error : x.min() < 0. Please provide an angle vector with all angles >=0."; return y; } - if(x.max() > sim_pi) { + if(x.max() > simcoon::pi) { cout << "Error : x.max() > pi Please provide an angle vector with all angles <=pi"; return y; } @@ -162,7 +162,7 @@ phase_characteristics discretize_ODF(const phase_characteristics &rve_init, ODF fill_angles(alpha, temp, odf_rve, angles_mat); if(alpha - odf_rve.limits(0) < dalpha) - temp.sptr_shape->concentration = dalpha/6. * (odf_rve.density(sim_pi+alpha-dalpha/2) + 4.*odf_rve.density(alpha) + odf_rve.density(alpha+dalpha/2)); + temp.sptr_shape->concentration = dalpha/6. * (odf_rve.density(simcoon::pi+alpha-dalpha/2) + 4.*odf_rve.density(alpha) + odf_rve.density(alpha+dalpha/2)); else temp.sptr_shape->concentration = dalpha/6. * (odf_rve.density(alpha-dalpha/2) + 4.*odf_rve.density(alpha) + odf_rve.density(alpha+dalpha/2)); diff --git a/src/Continuum_mechanics/Material/peak.cpp b/src/Continuum_mechanics/Material/peak.cpp index 16e47cf41..cfd181e59 100755 --- a/src/Continuum_mechanics/Material/peak.cpp +++ b/src/Continuum_mechanics/Material/peak.cpp @@ -117,25 +117,25 @@ double peak::get_density_ODF(const double &theta) break; } case 2: { - return ODF_hard(theta, mean, s_dev, ampl) + ODF_hard(theta - sim_pi, mean, s_dev, ampl) + ODF_hard(theta + sim_pi, mean, s_dev, ampl); + return ODF_hard(theta, mean, s_dev, ampl) + ODF_hard(theta - simcoon::pi, mean, s_dev, ampl) + ODF_hard(theta + simcoon::pi, mean, s_dev, ampl); break; } case 3: { - return Gaussian(theta, mean, s_dev, ampl) + Gaussian(theta - sim_pi, mean, s_dev, ampl) + Gaussian(theta + sim_pi, mean, s_dev, ampl); + return Gaussian(theta, mean, s_dev, ampl) + Gaussian(theta - simcoon::pi, mean, s_dev, ampl) + Gaussian(theta + simcoon::pi, mean, s_dev, ampl); break; } case 4: { - return Lorentzian(theta, mean, width, ampl) + Lorentzian(theta - sim_pi, mean, width, ampl) + Lorentzian(theta + sim_pi, mean, width, ampl); + return Lorentzian(theta, mean, width, ampl) + Lorentzian(theta - simcoon::pi, mean, width, ampl) + Lorentzian(theta + simcoon::pi, mean, width, ampl); break; } case 5: { - return PseudoVoigt(theta, mean, s_dev, width, ampl, params) + PseudoVoigt(theta - sim_pi, mean, s_dev, width, ampl, params) + PseudoVoigt(theta + sim_pi, mean, s_dev, width, ampl, params); + return PseudoVoigt(theta, mean, s_dev, width, ampl, params) + PseudoVoigt(theta - simcoon::pi, mean, s_dev, width, ampl, params) + PseudoVoigt(theta + simcoon::pi, mean, s_dev, width, ampl, params); break; } case 6: { assert(width > 0.); double inv_width = 1./width; - return Pearson7(theta, mean, inv_width, params) + Pearson7(theta - sim_pi, mean, inv_width, params) + Pearson7(theta + sim_pi, mean, inv_width, params); + return Pearson7(theta, mean, inv_width, params) + Pearson7(theta - simcoon::pi, mean, inv_width, params) + Pearson7(theta + simcoon::pi, mean, inv_width, params); break; } case 7: { diff --git a/src/Continuum_mechanics/Material/read.cpp b/src/Continuum_mechanics/Material/read.cpp index 679531f6b..d5883e58b 100755 --- a/src/Continuum_mechanics/Material/read.cpp +++ b/src/Continuum_mechanics/Material/read.cpp @@ -87,9 +87,9 @@ void read_peak(ODF &odf_rve, const string &path_data, const string &inputfile) { } if(odf_rve.radian == false) { - odf_rve.peaks[i].mean *=(sim_pi/180.); - odf_rve.peaks[i].s_dev *=(sim_pi/180.); - odf_rve.peaks[i].width *=(sim_pi/180.); + odf_rve.peaks[i].mean *=(simcoon::pi/180.); + odf_rve.peaks[i].s_dev *=(simcoon::pi/180.); + odf_rve.peaks[i].width *=(simcoon::pi/180.); } } diff --git a/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp b/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp index a4f173d4f..859b28b16 100755 --- a/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp +++ b/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp @@ -134,7 +134,7 @@ void umat_generic_hyper_invariants(const std::string &umat_name, const vec &etot double c_2 = props(1); double kappa = props(2); dWdI_1_bar = c_1; - if(fabs(I_bar(1)) > sim_iota) { + if(fabs(I_bar(1)) > simcoon::iota) { dWdI_2_bar = c_2/I_bar(1); dW2dI_22_bar = -1.*c_2/pow(I_bar(1),2.); } diff --git a/src/Continuum_mechanics/Umat/Mechanical/Combined/Prony_Nfast_Plastic.cpp b/src/Continuum_mechanics/Umat/Mechanical/Combined/Prony_Nfast_Plastic.cpp index 68dbca7a3..30838dc79 100755 --- a/src/Continuum_mechanics/Umat/Mechanical/Combined/Prony_Nfast_Plastic.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Combined/Prony_Nfast_Plastic.cpp @@ -138,7 +138,7 @@ void umat_prony_Nfast_plastic(const vec &Etot, const vec &DEtot, vec &sigma, mat double Hp=0.; double dHpdp=0.; - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -231,7 +231,7 @@ void umat_prony_Nfast_plastic(const vec &Etot, const vec &DEtot, vec &sigma, mat } //PLastic part - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -254,7 +254,7 @@ void umat_prony_Nfast_plastic(const vec &Etot, const vec &DEtot, vec &sigma, mat Lambdav[i] = eta_norm_strain(flow_visco[i]); dPhi_idv_temp[i] = invH_i[i]*(eta_norm_strain(flow_visco[i])%Ir05()); //Dimension of strain (The flow is of stress type here) - if (DTime > sim_iota) { + if (DTime > simcoon::iota) { Phi(i+1) = norm_strain(flow_visco[i]) - Ds_j(i+1)/DTime; dPhidv[i] = -1.*sum((dPhi_idv_temp[i])%(L_i[i]*Lambdav[i]))-1./DTime; } @@ -319,7 +319,7 @@ void umat_prony_Nfast_plastic(const vec &Etot, const vec &DEtot, vec &sigma, mat for (int i=0; i sim_iota) + if(Ds_j(i) > simcoon::iota) op(i) = 1.; for (int j = 0; j sim_limit) + if (p_ts > simcoon::limit) Hp_ts = beta_ts*pow(p_ts, alpha_ts); else - Hp_ts = sim_iota; + Hp_ts = simcoon::iota; //effective stress sigma_eff = el_pred(L,Eel,ndi); @@ -242,10 +242,10 @@ void umat_damage_LLD_0(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, m //Compute the explicit flow direction Lambdap_ts = eta_stress(sigma_eff_ts); - if (p_ts > sim_limit) + if (p_ts > simcoon::limit) dPhip_tsdp_ts = -1.*alpha_ts*beta_ts*pow(p_ts, alpha_ts-1.); else - dPhip_tsdp_ts = sim_iota; + dPhip_tsdp_ts = simcoon::iota; dPhi_p_tsd_sigma = Theta_ts*eta_stress(sigma_eff_ts); //Here as well @@ -319,22 +319,22 @@ void umat_damage_LLD_0(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, m Eel = Etot + DEtot - alpha*(T+DT-Tinit) - EP; sigma = el_pred(L_tilde, Eel, ndi); - if (fabs(sigma(1)) < sim_iota ) + if (fabs(sigma(1)) < simcoon::iota ) Yd_22 = 0.; else Yd_22 = 0.5*(pow(Macaulay_p(sigma(1)),2.)/(E2_0*pow(1.-d_22,2.))); - if (fabs(sigma(2)) < sim_iota ) + if (fabs(sigma(2)) < simcoon::iota ) Yd_33 = 0.; else Yd_33 = 0.5*(pow(Macaulay_p(sigma(2)),2.)/(E2_0*pow(1.-d_22,2.))); - if (fabs(sigma(3)) < sim_iota ) + if (fabs(sigma(3)) < simcoon::iota ) Yd_12 = 0.; else Yd_12 = 0.5*(pow(sigma(3),2.)/(G12_0*pow(1.-d_12,2.))); - if (fabs(sigma(4)) < sim_iota ) + if (fabs(sigma(4)) < simcoon::iota ) Yd_13 = 0.; else Yd_13 = 0.5*(pow(sigma(4),2.)/(G12_0*pow(1.-d_12,2.))); @@ -347,29 +347,29 @@ void umat_damage_LLD_0(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, m lambda_22 = lagrange_pow_1(d_22, c_lambda, p0_lambda, n_lambda, alpha_lambda); //Preliminaries to compute damage the derivatives of Phi - if (fabs(sigma(1)) < sim_iota ) + if (fabs(sigma(1)) < simcoon::iota ) dYd_22dd = 0.; else dYd_22dd = -0.25*(pow(Macaulay_p(sigma(1)),2.)/(E2_0*pow(1-d_22,3.))); - if (fabs(sigma(2)) < sim_iota ) + if (fabs(sigma(2)) < simcoon::iota ) dYd_33dd = 0.; else dYd_33dd = -0.25*(pow(Macaulay_p(sigma(2)),2.)/(E2_0*pow(1-d_22,3.))); - if (fabs(sigma(3)) < sim_iota ) + if (fabs(sigma(3)) < simcoon::iota ) dYd_12dd = 0.; else dYd_12dd = -0.25*(pow(sigma(3),2.)/(G12_0*pow(1-d_12,3.))); - if (fabs(sigma(4)) < sim_iota ) + if (fabs(sigma(4)) < simcoon::iota ) dYd_13dd = 0.; else dYd_13dd = -0.25*(pow(sigma(4),2.)/(G12_0*pow(1-d_12,3.))); - if (fabs(Yd_12 + Yd_13 + b*(Yd_22 + Yd_33)) < sim_iota ) { + if (fabs(Yd_12 + Yd_13 + b*(Yd_22 + Yd_33)) < simcoon::iota ) { dY_tsdd_22 = 0.; dY_tsdd_12 = 0.; } @@ -390,7 +390,7 @@ void umat_damage_LLD_0(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, m dYts_d_Y12 = 0.; dYts_d_Y13 = 0.; - if (Y_ts > sim_limit) { + if (Y_ts > simcoon::limit) { dYts_d_Y22 = b/(2.*Y_ts); dYts_d_Y33 = b/(2.*Y_ts); dYts_d_Y12 = 1./(2.*Y_ts); @@ -494,7 +494,7 @@ void umat_damage_LLD_0(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, m dYts_d_Y12 = 0.; dYts_d_Y13 = 0.; - if (Y_ts > sim_limit) { + if (Y_ts > simcoon::limit) { dYts_d_Y22 = b/(2.*Y_ts); dYts_d_Y33 = b/(2.*Y_ts); dYts_d_Y12 = 1./(2.*Y_ts); @@ -588,11 +588,11 @@ void umat_damage_LLD_0(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, m vec op = zeros(3); mat delta = eye(3,3); - if(Dd(0) > sim_iota) + if(Dd(0) > simcoon::iota) op(0) = 1.; - if(Dd(1) > sim_iota) + if(Dd(1) > simcoon::iota) op(1) = 1.; - if(Dp(0) > sim_iota) + if(Dp(0) > simcoon::iota) op(2) = 1.; diff --git a/src/Continuum_mechanics/Umat/Mechanical/Damage/damage_weibull.cpp b/src/Continuum_mechanics/Umat/Mechanical/Damage/damage_weibull.cpp index bb6bac4e4..a0e75f3cd 100755 --- a/src/Continuum_mechanics/Umat/Mechanical/Damage/damage_weibull.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Damage/damage_weibull.cpp @@ -97,7 +97,7 @@ void umat_damage_weibull(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, double A_Damage = 0.; double Rv = 0.; - if (Mises_stress(sigma) > sim_iota) { + if (Mises_stress(sigma) > simcoon::iota) { Rv = (2./3.)*(1.+nu)+3.*(1.-2.*nu)*pow(tr(sigma)/(3.*Mises_stress(sigma)),2.); A_Damage = pow(Mises_stress(sigma),2.)*Rv/(2.*E*pow(1.-Damage,2.)); } @@ -200,7 +200,7 @@ void umat_damage_weibull(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } @@ -226,7 +226,7 @@ void umat_damage_weibull(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, Lt = L_tilde - (kappa_j[0]*P_epsilon[0].t()); //Lt = L_tilde; - if (Mises_stress(sigma) > sim_iota) { + if (Mises_stress(sigma) > simcoon::iota) { Rv = (2./3.)*(1.+nu)+3.*(1.-2.*nu)*pow(tr(sigma)/(3.*Mises_stress(sigma)),2.); A_Damage = pow(Mises_stress(sigma),2.)*Rv/(2.*E*pow(1.-Damage,2.)); } diff --git a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Ani_chaboche_ccp.cpp b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Ani_chaboche_ccp.cpp index c9ba568a9..df470ebfd 100755 --- a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Ani_chaboche_ccp.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Ani_chaboche_ccp.cpp @@ -182,7 +182,7 @@ void umat_ani_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat &L //Additional parameters and variables double dHpdp=0.; - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = b*(Q-Hp); } else { @@ -239,7 +239,7 @@ void umat_ani_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat &L for (compteur = 0; ((compteur < maxiter_umat) && (error > precision_umat)); compteur++) { p = s_j(0); - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = b*(Q-Hp); } else { @@ -297,7 +297,7 @@ void umat_ani_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat &L mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/DFA_chaboche_ccp.cpp b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/DFA_chaboche_ccp.cpp index 28452ebd0..35ed54fae 100755 --- a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/DFA_chaboche_ccp.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/DFA_chaboche_ccp.cpp @@ -180,7 +180,7 @@ void umat_dfa_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat &L //Additional parameters and variables double dHpdp=0.; - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = b*(Q-Hp); } else { @@ -237,7 +237,7 @@ void umat_dfa_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat &L for (compteur = 0; ((compteur < maxiter_umat) && (error > precision_umat)); compteur++) { p = s_j(0); - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = b*(Q-Hp); } else { @@ -295,7 +295,7 @@ void umat_dfa_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat &L mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Generic_chaboche_ccp.cpp b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Generic_chaboche_ccp.cpp index d5a5b32f5..7b431ecd6 100755 --- a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Generic_chaboche_ccp.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Generic_chaboche_ccp.cpp @@ -222,7 +222,7 @@ void umat_generic_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, ma //Additional parameters and variables double dHpdp=0.; - if (p > sim_iota) { + if (p > simcoon::iota) { for (int i=0; i precision_umat)); compteur++) { p = s_j(0); - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = 0.; for (int i=0; i sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_chaboche_ccp.cpp b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_chaboche_ccp.cpp index e15d0c295..4d2222c1b 100755 --- a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_chaboche_ccp.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_chaboche_ccp.cpp @@ -179,7 +179,7 @@ void umat_hill_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat & //Additional parameters and variables double dHpdp=0.; - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = b*(Q-Hp); } else { @@ -236,7 +236,7 @@ void umat_hill_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat & for (compteur = 0; ((compteur < maxiter_umat) && (error > precision_umat)); compteur++) { p = s_j(0); - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = b*(Q-Hp); } else { @@ -294,7 +294,7 @@ void umat_hill_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat & mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_isoh.cpp b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_isoh.cpp index 3865fac2f..e99b1e6ea 100755 --- a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_isoh.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_isoh.cpp @@ -147,7 +147,7 @@ void umat_plasticity_hill_isoh_CCP(const vec &Etot, const vec &DEtot, vec &sigma double Hp=0.; double dHpdp=0.; - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -194,7 +194,7 @@ void umat_plasticity_hill_isoh_CCP(const vec &Etot, const vec &DEtot, vec &sigma for (compteur = 0; ((compteur < maxiter_umat) && (error > precision_umat)); compteur++) { p = s_j(0); - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -238,7 +238,7 @@ void umat_plasticity_hill_isoh_CCP(const vec &Etot, const vec &DEtot, vec &sigma mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_isoh_Nfast.cpp b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_isoh_Nfast.cpp index 998de2678..6f0095075 100755 --- a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_isoh_Nfast.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/Hill_isoh_Nfast.cpp @@ -145,7 +145,7 @@ void umat_plasticity_hill_isoh_CCP_N(const vec &Etot, const vec &DEtot, vec &sig vec dHpdp = zeros(N_plas); for (int i=0; i sim_iota) { + if (p[i] > simcoon::iota) { dHpdp[i] = m[i]*k[i]*pow(p[i], m[i]-1.0); Hp[i] = k[i]*pow(p[i], m[i]); } @@ -195,7 +195,7 @@ void umat_plasticity_hill_isoh_CCP_N(const vec &Etot, const vec &DEtot, vec &sig p = s_j; for (int i=0; i sim_iota) { + if (p[i] > simcoon::iota) { dHpdp[i] = m[i]*k[i]*pow(p[i], m[i]-1.0); Hp[i] = k[i]*pow(p[i], m[i]); } @@ -248,7 +248,7 @@ void umat_plasticity_hill_isoh_CCP_N(const vec &Etot, const vec &DEtot, vec &sig mat delta = eye(N_plas,N_plas); for (int i=0; i sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_chaboche_ccp.cpp b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_chaboche_ccp.cpp index 2f61984a6..d46fb9709 100755 --- a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_chaboche_ccp.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_chaboche_ccp.cpp @@ -168,7 +168,7 @@ void umat_plasticity_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, //Additional parameters and variables double dHpdp=0.; - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = b*(Q-Hp); } else { @@ -224,7 +224,7 @@ void umat_plasticity_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, for (compteur = 0; ((compteur < maxiter_umat) && (error > precision_umat)); compteur++) { p = s_j(0); - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = b*(Q-Hp); } else { @@ -282,7 +282,7 @@ void umat_plasticity_chaboche_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_isotropic_ccp.cpp b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_isotropic_ccp.cpp index fa4238780..fa96207dc 100755 --- a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_isotropic_ccp.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_isotropic_ccp.cpp @@ -138,7 +138,7 @@ void umat_plasticity_iso_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat double Hp=0.; double dHpdp=0.; - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -185,7 +185,7 @@ void umat_plasticity_iso_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat for (compteur = 0; ((compteur < maxiter_umat) && (error > precision_umat)); compteur++) { p = s_j(0); - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -231,7 +231,7 @@ void umat_plasticity_iso_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_kin_iso_ccp.cpp b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_kin_iso_ccp.cpp index 713660794..9a3974b08 100755 --- a/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_kin_iso_ccp.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Plasticity/plastic_kin_iso_ccp.cpp @@ -135,7 +135,7 @@ void umat_plasticity_kin_iso_CCP(const vec &Etot, const vec &DEtot, vec &sigma, double Hp=0.; double dHpdp=0.; - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -188,7 +188,7 @@ void umat_plasticity_kin_iso_CCP(const vec &Etot, const vec &DEtot, vec &sigma, for (compteur = 0; ((compteur < maxiter_umat) && (error > precision_umat)); compteur++) { p = s_j(0); - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -239,7 +239,7 @@ void umat_plasticity_kin_iso_CCP(const vec &Etot, const vec &DEtot, vec &sigma, mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp index 7d468e4b5..0d1cfdac3 100644 --- a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp @@ -169,7 +169,7 @@ void umat_sma_mono(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, mat & ET = vide; xi = 0.; for(int i=0; i sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Mechanical/Viscoelasticity/Prony_Nfast.cpp b/src/Continuum_mechanics/Umat/Mechanical/Viscoelasticity/Prony_Nfast.cpp index 488ced93c..c1643a341 100644 --- a/src/Continuum_mechanics/Umat/Mechanical/Viscoelasticity/Prony_Nfast.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/Viscoelasticity/Prony_Nfast.cpp @@ -184,7 +184,7 @@ void umat_prony_Nfast(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, co Lambdav[i] = eta_norm_strain(flow_visco[i]); dPhi_idv_temp[i] = invH_i[i]*(eta_norm_strain(flow_visco[i])%Ir05()); //Dimension of strain (The flow is of stress type here) - if (DTime > sim_iota) { + if (DTime > simcoon::iota) { Phi(i) = norm_strain(flow_visco[i]) - Ds_j(i)/DTime; dPhidv[i] = -1.*sum((dPhi_idv_temp[i])%(L_i[i]*Lambdav[i]))-1./DTime; } @@ -241,7 +241,7 @@ void umat_prony_Nfast(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, co for (int i=0; i sim_iota) + if(Ds_j(i) > simcoon::iota) op(i) = 1.; for (int j = 0; j sim_iota) { + if (DTime > simcoon::iota) { Phi(i) = norm_strain(flow_visco[i]) - Ds_j(i)/DTime; dPhidv[i] = -1.*sum((dPhi_idsigma[i])%(L_i[i]*Lambdav[i]))-1./DTime; } @@ -243,7 +243,7 @@ void umat_zener_Nfast(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, co for (int i=0; i sim_iota) + if(Ds_j(i) > simcoon::iota) op(i) = 1.; for (int j = 0; j sim_iota) { + if (DTime > simcoon::iota) { Phi(0) = norm_strain(flow_V1) - Ds_j(0)/DTime; dPhidv = -1.*sum((dPhidsigma)%(L1*Lambdav))-1./DTime; } @@ -169,7 +169,7 @@ void umat_zener_fast(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, con mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Thermomechanical/Plasticity/plastic_isotropic_ccp.cpp b/src/Continuum_mechanics/Umat/Thermomechanical/Plasticity/plastic_isotropic_ccp.cpp index 0ee9cf82e..58bf2273d 100755 --- a/src/Continuum_mechanics/Umat/Thermomechanical/Plasticity/plastic_isotropic_ccp.cpp +++ b/src/Continuum_mechanics/Umat/Thermomechanical/Plasticity/plastic_isotropic_ccp.cpp @@ -148,7 +148,7 @@ void umat_plasticity_iso_CCP_T(const vec &Etot, const vec &DEtot, vec &sigma, do double Hp=0.; double dHpdp=0.; - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -195,7 +195,7 @@ void umat_plasticity_iso_CCP_T(const vec &Etot, const vec &DEtot, vec &sigma, do for (compteur = 0; ((compteur < maxiter_umat) && (error > precision_umat)); compteur++) { p = s_j(0); - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -239,7 +239,7 @@ void umat_plasticity_iso_CCP_T(const vec &Etot, const vec &DEtot, vec &sigma, do mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Thermomechanical/Plasticity/plastic_kin_iso_ccp.cpp b/src/Continuum_mechanics/Umat/Thermomechanical/Plasticity/plastic_kin_iso_ccp.cpp index 2c9feb835..067800c11 100755 --- a/src/Continuum_mechanics/Umat/Thermomechanical/Plasticity/plastic_kin_iso_ccp.cpp +++ b/src/Continuum_mechanics/Umat/Thermomechanical/Plasticity/plastic_kin_iso_ccp.cpp @@ -144,7 +144,7 @@ void umat_plasticity_kin_iso_CCP_T(const vec &Etot, const vec &DEtot, vec &sigma double Hp=0.; double dHpdp=0.; - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -197,7 +197,7 @@ void umat_plasticity_kin_iso_CCP_T(const vec &Etot, const vec &DEtot, vec &sigma for (compteur = 0; ((compteur < maxiter_umat) && (error > precision_umat)); compteur++) { p = s_j(0); - if (p > sim_iota) { + if (p > simcoon::iota) { dHpdp = m*k*pow(p, m-1); Hp = k*pow(p, m); } @@ -246,7 +246,7 @@ void umat_plasticity_kin_iso_CCP_T(const vec &Etot, const vec &DEtot, vec &sigma mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Thermomechanical/SMA/unified_T.cpp b/src/Continuum_mechanics/Umat/Thermomechanical/SMA/unified_T.cpp index 0bb34639b..da5c0565c 100755 --- a/src/Continuum_mechanics/Umat/Thermomechanical/SMA/unified_T.cpp +++ b/src/Continuum_mechanics/Umat/Thermomechanical/SMA/unified_T.cpp @@ -197,7 +197,7 @@ void umat_sma_unified_T_T(const vec &Etot, const vec &DEtot, vec &sigma, double vec vide = zeros(6); sigma = zeros(6); ET = zeros(6); - xiF = sim_limit; + xiF = simcoon::limit; xiR = 0.; xi = xiF; @@ -601,7 +601,7 @@ void umat_sma_unified_T_T(const vec &Etot, const vec &DEtot, vec &sigma, double mat delta = eye(2,2); for (int i=0; i<2; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/Thermomechanical/Viscoelasticity/Prony_Nfast.cpp b/src/Continuum_mechanics/Umat/Thermomechanical/Viscoelasticity/Prony_Nfast.cpp index 7467493bd..654c4a8cc 100644 --- a/src/Continuum_mechanics/Umat/Thermomechanical/Viscoelasticity/Prony_Nfast.cpp +++ b/src/Continuum_mechanics/Umat/Thermomechanical/Viscoelasticity/Prony_Nfast.cpp @@ -201,7 +201,7 @@ void umat_prony_Nfast_T(const vec &Etot, const vec &DEtot, vec &sigma, double &r dPhi_idv_temp[i] = invH_i[i]*(eta_norm_strain(flow_visco[i])%Ir05()); //Dimension of strain (The flow is of stress type here) kappa_j[i] = L_i[i]*Lambdav[i]; - if (DTime > sim_iota) { + if (DTime > simcoon::iota) { Phi(i) = norm_strain(flow_visco[i]) - Ds_j(i)/DTime; dPhidv[i] = -1.*sum((dPhi_idv_temp[i])%(L_i[i]*Lambdav[i]))-1./DTime; } @@ -271,7 +271,7 @@ void umat_prony_Nfast_T(const vec &Etot, const vec &DEtot, vec &sigma, double &r for (int i=0; i sim_iota) + if(Ds_j(i) > simcoon::iota) op(i) = 1.; for (int j = 0; j sim_iota) { + if (DTime > simcoon::iota) { Phi(i) = norm_strain(flow_visco[i]) - Ds_j(i)/DTime; dPhidv[i] = -1.*sum((dPhi_idsigma[i])%(L_i[i]*Lambdav[i]))-1./DTime; } @@ -276,7 +276,7 @@ void umat_zener_Nfast_T(const vec &Etot, const vec &DEtot, vec &sigma, double &r for (int i=0; i sim_iota) + if(Ds_j(i) > simcoon::iota) op(i) = 1.; for (int j = 0; j sim_iota) { + if (DTime > simcoon::iota) { Phi(0) = norm_stress(sigma_tildeV1) - Ds_j(0)/DTime; dPhidv = -1.*sum((dPhidsigma%Ir2())%(L1*Lambdav))-1./DTime; } @@ -200,7 +200,7 @@ void umat_zener_fast_T(const vec &Etot, const vec &DEtot, vec &sigma, double &r, mat delta = eye(1,1); for (int i=0; i<1; i++) { - if(Ds_j[i] > sim_iota) + if(Ds_j[i] > simcoon::iota) op(i) = 1.; } diff --git a/src/Continuum_mechanics/Umat/umat_smart.cpp b/src/Continuum_mechanics/Umat/umat_smart.cpp index c422c1ba3..126183bf5 100755 --- a/src/Continuum_mechanics/Umat/umat_smart.cpp +++ b/src/Continuum_mechanics/Umat/umat_smart.cpp @@ -897,7 +897,7 @@ void run_umat_T(phase_characteristics &rve, const mat &DR,const double &Time,con tnew_dt = 1.; - if (Time > sim_limit) { + if (Time > simcoon::limit) { start = false; } switch (control_type) { @@ -920,7 +920,7 @@ void run_umat_M(phase_characteristics &rve, const mat &DR, const double &Time, c { tnew_dt = 1.; - if (Time > sim_limit) { + if (Time > simcoon::limit) { start = false; } switch (control_type) { diff --git a/src/Simulation/Identification/identification.cpp b/src/Simulation/Identification/identification.cpp index 1e742e954..6123a4af0 100755 --- a/src/Simulation/Identification/identification.cpp +++ b/src/Simulation/Identification/identification.cpp @@ -278,7 +278,7 @@ void run_identification(const std::string &simul_type, const int &n_param, const find_best(gen[g], gboys[g], gen[g-1], gboys[g-1], gensons, maxpop, n_param, id0); write_results(result, outputfile, gen[g], g, maxpop, n_param); - if(fabs(costnm1 - gen[g].pop[0].cout) < sim_iota) { + if(fabs(costnm1 - gen[g].pop[0].cout) < simcoon::iota) { compt_des++; } else{ diff --git a/src/Simulation/Identification/optimize.cpp b/src/Simulation/Identification/optimize.cpp index 12dfc1153..5b102b6e2 100755 --- a/src/Simulation/Identification/optimize.cpp +++ b/src/Simulation/Identification/optimize.cpp @@ -81,7 +81,7 @@ Col checkS(const mat &S) { for(int i=0; i sim_iota) { + if (W(z) > simcoon::iota) { Cout += pow((vexp(z)-vnum(z)), 2.)*W(z); } } diff --git a/src/Simulation/Maths/num_solve.cpp b/src/Simulation/Maths/num_solve.cpp index d20ae0a62..f54e5b9eb 100755 --- a/src/Simulation/Maths/num_solve.cpp +++ b/src/Simulation/Maths/num_solve.cpp @@ -37,7 +37,7 @@ void Newton_Raphon(const vec &Phi, const vec &Y_crit, const mat &denom, vec &Dp, assert(fabs(Y_crit(i)) > 0.); } - if (fabs(det(denom)) > sim_limit) { + if (fabs(det(denom)) > simcoon::limit) { dp = -1.*solve(denom,Phi); } else { @@ -100,7 +100,7 @@ void Fischer_Burmeister(const vec &Phi, const vec &Y_crit, const mat &denom, vec } - if (fabs(det(denomFB)) > sim_limit) { + if (fabs(det(denomFB)) > simcoon::limit) { dp = -1.*solve(denomFB,FB); } else { @@ -218,7 +218,7 @@ void Fischer_Burmeister_limits(const vec &Phi_p, const vec &Phi_l, const vec &Y_ } } - if (fabs(det(denomFB)) > sim_limit) { + if (fabs(det(denomFB)) > simcoon::limit) { dp = -1.*solve(denomFB,FB); } else { @@ -291,7 +291,7 @@ void Fischer_Burmeister_m(const vec &Phi, const vec &Y_crit, const mat &denom, v } - if (fabs(det(denomFB)) > sim_limit) { + if (fabs(det(denomFB)) > simcoon::limit) { dp = -1.*solve(denomFB, FB); } else { @@ -421,7 +421,7 @@ void Fischer_Burmeister_m_limits(const vec &Phi_p, const vec &Phi_l, const vec & } } - if (fabs(det(denomFB)) > sim_limit) { + if (fabs(det(denomFB)) > simcoon::limit) { dp = -1.*solve(denomFB, FB); } else { diff --git a/src/Simulation/Maths/rotation.cpp b/src/Simulation/Maths/rotation.cpp index df1e1bbb6..61f0ee3e7 100755 --- a/src/Simulation/Maths/rotation.cpp +++ b/src/Simulation/Maths/rotation.cpp @@ -660,13 +660,13 @@ vec rotate_strain(const vec &V, const mat &DR, const bool &active) { mat rotate_l2g_strain(const vec &E, const double &psi, const double &theta, const double &phi) { mat E_temp = E; - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { E_temp = rotate_strain(E_temp, -phi, axis_phi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { E_temp = rotate_strain(E_temp, -theta, axis_theta, false); } - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { E_temp = rotate_strain(E_temp, -psi, axis_psi, false); } @@ -677,13 +677,13 @@ mat rotate_l2g_strain(const vec &E, const double &psi, const double &theta, cons mat rotate_g2l_strain(const vec &E, const double &psi, const double &theta, const double &phi) { mat E_temp = E; - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { E_temp = rotate_strain(E_temp, psi, axis_psi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { E_temp = rotate_strain(E_temp, theta, axis_theta, false); } - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { E_temp = rotate_strain(E_temp, phi, axis_phi, false); } @@ -694,13 +694,13 @@ mat rotate_g2l_strain(const vec &E, const double &psi, const double &theta, cons mat rotate_l2g_stress(const vec &S, const double &psi, const double &theta, const double &phi) { mat S_temp = S; - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { S_temp = rotate_stress(S_temp, -phi, axis_phi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { S_temp = rotate_stress(S_temp, -theta, axis_theta, false); } - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { S_temp = rotate_stress(S_temp, -psi, axis_psi, false); } @@ -711,13 +711,13 @@ mat rotate_l2g_stress(const vec &S, const double &psi, const double &theta, cons mat rotate_g2l_stress(const vec &S, const double &psi, const double &theta, const double &phi) { mat S_temp = S; - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { S_temp = rotate_stress(S_temp, psi, axis_psi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { S_temp = rotate_stress(S_temp, theta, axis_theta, false); } - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { S_temp = rotate_stress(S_temp, phi, axis_phi, false); } @@ -728,13 +728,13 @@ mat rotate_g2l_stress(const vec &S, const double &psi, const double &theta, cons mat rotate_l2g_L(const mat &Lt, const double &psi, const double &theta, const double &phi) { mat Lt_temp = Lt; - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { Lt_temp = rotateL(Lt_temp, -phi, axis_phi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { Lt_temp = rotateL(Lt_temp, -theta, axis_theta, false); } - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { Lt_temp = rotateL(Lt_temp, -psi, axis_psi, false); } @@ -745,13 +745,13 @@ mat rotate_l2g_L(const mat &Lt, const double &psi, const double &theta, const do mat rotate_g2l_L(const mat &Lt, const double &psi, const double &theta, const double &phi) { mat Lt_temp = Lt; - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { Lt_temp = rotateL(Lt_temp, psi, axis_psi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { Lt_temp = rotateL(Lt_temp, theta, axis_theta, false); } - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { Lt_temp = rotateL(Lt_temp, phi, axis_phi, false); } @@ -762,13 +762,13 @@ mat rotate_g2l_L(const mat &Lt, const double &psi, const double &theta, const do mat rotate_l2g_M(const mat &M, const double &psi, const double &theta, const double &phi) { mat M_temp = M; - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { M_temp = rotateM(M_temp, -phi, axis_phi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { M_temp = rotateM(M_temp, -theta, axis_theta, false); } - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { M_temp = rotateM(M_temp, -psi, axis_psi, false); } @@ -779,13 +779,13 @@ mat rotate_l2g_M(const mat &M, const double &psi, const double &theta, const dou mat rotate_g2l_M(const mat &M, const double &psi, const double &theta, const double &phi) { mat M_temp = M; - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { M_temp = rotateM(M_temp, psi, axis_psi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { M_temp = rotateM(M_temp, theta, axis_theta, false); } - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { M_temp = rotateM(M_temp, phi, axis_phi, false); } @@ -796,13 +796,13 @@ mat rotate_g2l_M(const mat &M, const double &psi, const double &theta, const dou mat rotate_l2g_A(const mat &A, const double &psi, const double &theta, const double &phi) { mat A_temp = A; - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { A_temp = rotateA(A_temp, -phi, axis_phi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { A_temp = rotateA(A_temp, -theta, axis_theta, false); } - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { A_temp = rotateA(A_temp, -psi, axis_psi, false); } @@ -813,13 +813,13 @@ mat rotate_l2g_A(const mat &A, const double &psi, const double &theta, const dou mat rotate_g2l_A(const mat &A, const double &psi, const double &theta, const double &phi) { mat A_temp = A; - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { A_temp = rotateA(A_temp, psi, axis_psi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { A_temp = rotateA(A_temp, theta, axis_theta, false); } - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { A_temp = rotateA(A_temp, phi, axis_phi, false); } @@ -830,13 +830,13 @@ mat rotate_g2l_A(const mat &A, const double &psi, const double &theta, const dou mat rotate_l2g_B(const mat &B, const double &psi, const double &theta, const double &phi) { mat B_temp = B; - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { B_temp = rotateB(B_temp, -phi, axis_phi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { B_temp = rotateB(B_temp, -theta, axis_theta, false); } - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { B_temp = rotateB(B_temp, -psi, axis_psi, false); } @@ -847,13 +847,13 @@ mat rotate_l2g_B(const mat &B, const double &psi, const double &theta, const dou mat rotate_g2l_B(const mat &B, const double &psi, const double &theta, const double &phi) { mat B_temp = B; - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { B_temp = rotateB(B_temp, psi, axis_psi, false); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { B_temp = rotateB(B_temp, theta, axis_theta, false); } - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { B_temp = rotateB(B_temp, phi, axis_phi, false); } diff --git a/src/Simulation/Maths/stats.cpp b/src/Simulation/Maths/stats.cpp index aa1d59827..32b8c49a9 100755 --- a/src/Simulation/Maths/stats.cpp +++ b/src/Simulation/Maths/stats.cpp @@ -41,7 +41,7 @@ double normal_distrib(const double &x, const double &mean, const double &dev){ else { double k = 1.0/(1.0 + 0.2316419*x_norm); double k_sum = k*(0.319381530 + k*(-0.356563782 + k*(1.781477937 + k*(-1.821255978 + 1.330274429*k)))); - return (1.0 - (1.0/(sqrt(2*sim_pi)))*exp(-0.5*x_norm*x_norm) * k_sum); + return (1.0 - (1.0/(sqrt(2*simcoon::pi)))*exp(-0.5*x_norm*x_norm) * k_sum); } } @@ -86,7 +86,7 @@ double ODF_sd(const double &Theta, const double &mean, const vec ¶ms) { if (fabs(Theta - mean) < 1.E-6) return alpha1; - else if (fabs((Theta - mean)-0.5*sim_pi) < 1.E-6) + else if (fabs((Theta - mean)-0.5*simcoon::pi) < 1.E-6) return 0.; else return fabs((alpha1*pow(cos(Theta - mean),2.*pow1) + alpha2*pow(cos(Theta - mean),2.*pow2)*pow(sin(Theta - mean),2.*pow2))*cos(Theta - mean)); @@ -106,7 +106,7 @@ double Gaussian(const double &X, const double &mean, const double &std_dev, cons assert(std_dev>0); - return ampl/(std_dev * sqrt(2.*sim_pi)) * exp(-1./2. * pow((X - mean)/std_dev, 2.)); + return ampl/(std_dev * sqrt(2.*simcoon::pi)) * exp(-1./2. * pow((X - mean)/std_dev, 2.)); } ///4. Lorentzian @@ -114,7 +114,7 @@ double Lorentzian(const double &X, const double &mean, const double &width, cons assert(width>0); - return ampl * width/(2.*sim_pi*(pow(X - mean, 2.)+ pow(width / 2., 2.))); + return ampl * width/(2.*simcoon::pi*(pow(X - mean, 2.)+ pow(width / 2., 2.))); } ///5. Pseudo-Voigt @@ -134,7 +134,7 @@ double Pearson7(const double& X, const double& mean, const double &inv_width, ve double max = params(0); double shape = params(1); assert(shape>0); - if (fabs(max) < sim_limit) { + if (fabs(max) < simcoon::limit) { max = 1.; } diff --git a/src/Simulation/Phase/read.cpp b/src/Simulation/Phase/read.cpp index 63b8ab55c..7bb50280a 100755 --- a/src/Simulation/Phase/read.cpp +++ b/src/Simulation/Phase/read.cpp @@ -140,9 +140,9 @@ void read_phase(phase_characteristics &rve, const string &path_data, const strin paramphases >> r.sptr_matprops->props(j); } - r.sptr_matprops->psi_mat*=(sim_pi/180.); - r.sptr_matprops->theta_mat*=(sim_pi/180.); - r.sptr_matprops->phi_mat*=(sim_pi/180.); + r.sptr_matprops->psi_mat*=(simcoon::pi/180.); + r.sptr_matprops->theta_mat*=(simcoon::pi/180.); + r.sptr_matprops->phi_mat*=(simcoon::pi/180.); } paramphases.close(); @@ -210,13 +210,13 @@ void read_layer(phase_characteristics &rve, const string &path_data, const strin paramphases >> r.sptr_matprops->props(j); } - r.sptr_matprops->psi_mat*=(sim_pi/180.); - r.sptr_matprops->theta_mat*=(sim_pi/180.); - r.sptr_matprops->phi_mat*=(sim_pi/180.); + r.sptr_matprops->psi_mat*=(simcoon::pi/180.); + r.sptr_matprops->theta_mat*=(simcoon::pi/180.); + r.sptr_matprops->phi_mat*=(simcoon::pi/180.); - sptr_layer->psi_geom*=(sim_pi/180.); - sptr_layer->theta_geom*=(sim_pi/180.); - sptr_layer->phi_geom*=(sim_pi/180.); + sptr_layer->psi_geom*=(simcoon::pi/180.); + sptr_layer->theta_geom*=(simcoon::pi/180.); + sptr_layer->phi_geom*=(simcoon::pi/180.); } paramphases.close(); @@ -284,13 +284,13 @@ void read_ellipsoid(phase_characteristics &rve, const string &path_data, const s paramphases >> r.sptr_matprops->props(j); } - r.sptr_matprops->psi_mat*=(sim_pi/180.); - r.sptr_matprops->theta_mat*=(sim_pi/180.); - r.sptr_matprops->phi_mat*=(sim_pi/180.); + r.sptr_matprops->psi_mat*=(simcoon::pi/180.); + r.sptr_matprops->theta_mat*=(simcoon::pi/180.); + r.sptr_matprops->phi_mat*=(simcoon::pi/180.); - sptr_ellipsoid->psi_geom*=(sim_pi/180.); - sptr_ellipsoid->theta_geom*=(sim_pi/180.); - sptr_ellipsoid->phi_geom*=(sim_pi/180.); + sptr_ellipsoid->psi_geom*=(simcoon::pi/180.); + sptr_ellipsoid->theta_geom*=(simcoon::pi/180.); + sptr_ellipsoid->phi_geom*=(simcoon::pi/180.); } paramphases.close(); @@ -369,13 +369,13 @@ void read_cylinder(phase_characteristics &rve, const string &path_data, const st paramphases >> r.sptr_matprops->props(j); } - r.sptr_matprops->psi_mat*=(sim_pi/180.); - r.sptr_matprops->theta_mat*=(sim_pi/180.); - r.sptr_matprops->phi_mat*=(sim_pi/180.); + r.sptr_matprops->psi_mat*=(simcoon::pi/180.); + r.sptr_matprops->theta_mat*=(simcoon::pi/180.); + r.sptr_matprops->phi_mat*=(simcoon::pi/180.); - sptr_cylinder->psi_geom*=(sim_pi/180.); - sptr_cylinder->theta_geom*=(sim_pi/180.); - sptr_cylinder->phi_geom*=(sim_pi/180.); + sptr_cylinder->psi_geom*=(simcoon::pi/180.); + sptr_cylinder->theta_geom*=(simcoon::pi/180.); + sptr_cylinder->phi_geom*=(simcoon::pi/180.); } paramphases.close(); diff --git a/src/Simulation/Phase/state_variables.cpp b/src/Simulation/Phase/state_variables.cpp index 90d45b148..38a97c921 100755 --- a/src/Simulation/Phase/state_variables.cpp +++ b/src/Simulation/Phase/state_variables.cpp @@ -498,7 +498,7 @@ state_variables& state_variables::rotate_l2g(const state_variables& sv, const do statev = sv.statev; statev_start = sv.statev_start; - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { Etot = rotate_strain(Etot, -phi, axis_phi); DEtot = rotate_strain(DEtot, -phi, axis_phi); etot = rotate_strain(etot, -phi, axis_phi); @@ -516,7 +516,7 @@ state_variables& state_variables::rotate_l2g(const state_variables& sv, const do R = rotate_mat(R, -phi, axis_phi); DR = rotate_mat(DR, -phi, axis_phi); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { Etot = rotate_strain(Etot, -theta, axis_theta); DEtot = rotate_strain(DEtot, -theta, axis_theta); etot = rotate_strain(etot, -theta, axis_theta); @@ -534,7 +534,7 @@ state_variables& state_variables::rotate_l2g(const state_variables& sv, const do R = rotate_mat(R, -theta, axis_theta); DR = rotate_mat(DR, -theta, axis_theta); } - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { Etot = rotate_strain(Etot, -psi, axis_psi); DEtot = rotate_strain(DEtot, -psi, axis_psi); etot = rotate_strain(etot, -psi, axis_psi); @@ -583,7 +583,7 @@ state_variables& state_variables::rotate_g2l(const state_variables& sv, const do statev = sv.statev; statev_start = sv.statev_start; - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { Etot = rotate_strain(Etot, psi, axis_psi); DEtot = rotate_strain(DEtot, psi, axis_psi); etot = rotate_strain(etot, psi, axis_psi); @@ -601,7 +601,7 @@ state_variables& state_variables::rotate_g2l(const state_variables& sv, const do R = rotate_mat(R, psi, axis_psi); DR = rotate_mat(DR, psi, axis_psi); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { Etot = rotate_strain(Etot, theta, axis_theta); DEtot = rotate_strain(DEtot, theta, axis_theta); etot = rotate_strain(etot, theta, axis_theta); @@ -619,7 +619,7 @@ state_variables& state_variables::rotate_g2l(const state_variables& sv, const do R = rotate_mat(R, theta, axis_theta); DR = rotate_mat(DR, theta, axis_theta); } - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { Etot = rotate_strain(Etot, phi, axis_phi); DEtot = rotate_strain(DEtot, phi, axis_phi); etot = rotate_strain(etot, phi, axis_phi); diff --git a/src/Simulation/Phase/state_variables_M.cpp b/src/Simulation/Phase/state_variables_M.cpp index 4d134f594..3c9f045ee 100755 --- a/src/Simulation/Phase/state_variables_M.cpp +++ b/src/Simulation/Phase/state_variables_M.cpp @@ -249,19 +249,19 @@ state_variables_M& state_variables_M::rotate_l2g(const state_variables_M& sv, co L = sv.L; Lt = sv.Lt; - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, -phi, axis_phi); sigma_in_start = rotate_stress(sigma_in_start, -phi, axis_phi); L = rotateL(L, -phi, axis_phi); Lt = rotateL(Lt, -phi, axis_phi); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, -theta, axis_theta); sigma_in_start = rotate_stress(sigma_in_start, -theta, axis_theta); Lt = rotateL(Lt, -theta, axis_theta); L = rotateL(L, -theta, axis_theta); } - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, -psi, axis_psi); sigma_in_start = rotate_stress(sigma_in_start, -psi, axis_psi); Lt = rotateL(Lt, -psi, axis_psi); @@ -287,19 +287,19 @@ state_variables_M& state_variables_M::rotate_g2l(const state_variables_M& sv, co L = sv.L; Lt = sv.Lt; - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, psi, axis_psi); sigma_in_start = rotate_stress(sigma_in_start, psi, axis_psi); L = rotateL(L, psi, axis_psi); Lt = rotateL(Lt, psi, axis_psi); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, theta, axis_theta); sigma_in_start = rotate_stress(sigma_in_start, theta, axis_theta); L = rotateL(L, theta, axis_theta); Lt = rotateL(Lt, theta, axis_theta); } - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, phi, axis_phi); sigma_in_start = rotate_stress(sigma_in_start, phi, axis_phi); L = rotateL(L, phi, axis_phi); diff --git a/src/Simulation/Phase/state_variables_T.cpp b/src/Simulation/Phase/state_variables_T.cpp index ebd513341..2572aa399 100755 --- a/src/Simulation/Phase/state_variables_T.cpp +++ b/src/Simulation/Phase/state_variables_T.cpp @@ -321,7 +321,7 @@ state_variables_T& state_variables_T::rotate_l2g(const state_variables_T& sv, co Wm_start = sv.Wm_start; Wt_start = sv.Wt_start; - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, -phi, axis_phi); sigma_in_start = rotate_stress(sigma_in_start, -phi, axis_phi); dSdE = rotateL(dSdE, -phi, axis_phi); @@ -329,7 +329,7 @@ state_variables_T& state_variables_T::rotate_l2g(const state_variables_T& sv, co dSdT = rotate_stress(dSdT, -phi, axis_phi); drdE = rotate_strain(drdE, -phi, axis_phi); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, -theta, axis_theta); sigma_in_start = rotate_stress(sigma_in_start, -theta, axis_theta); dSdE = rotateL(dSdE, -theta, axis_theta); @@ -337,7 +337,7 @@ state_variables_T& state_variables_T::rotate_l2g(const state_variables_T& sv, co dSdT = rotate_stress(dSdT, -theta, axis_theta); drdE = rotate_strain(drdE, -theta, axis_theta); } - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, -psi, axis_psi); sigma_in_start = rotate_stress(sigma_in_start, -psi, axis_psi); dSdE = rotateL(dSdE, -psi, axis_psi); @@ -371,7 +371,7 @@ state_variables_T& state_variables_T::rotate_g2l(const state_variables_T& sv, co Wm_start = sv.Wm_start; Wt_start = sv.Wt_start; - if(fabs(psi) > sim_iota) { + if(fabs(psi) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, psi, axis_psi); sigma_in_start = rotate_stress(sigma_in_start, psi, axis_psi); dSdE = rotateL(dSdE, psi, axis_psi); @@ -380,7 +380,7 @@ state_variables_T& state_variables_T::rotate_g2l(const state_variables_T& sv, co drdE = rotate_strain(drdE, psi, axis_psi); } - if(fabs(theta) > sim_iota) { + if(fabs(theta) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, theta, axis_theta); sigma_in_start = rotate_stress(sigma_in_start, theta, axis_theta); dSdE = rotateL(dSdE, theta, axis_theta); @@ -388,7 +388,7 @@ state_variables_T& state_variables_T::rotate_g2l(const state_variables_T& sv, co dSdT = rotate_stress(dSdT, theta, axis_theta); drdE = rotate_strain(drdE, theta, axis_theta); } - if(fabs(phi) > sim_iota) { + if(fabs(phi) > simcoon::iota) { sigma_in = rotate_stress(sigma_in, phi, axis_phi); sigma_in_start = rotate_stress(sigma_in_start, phi, axis_phi); dSdE = rotateL(dSdE, phi, axis_phi); diff --git a/src/Simulation/Phase/write.cpp b/src/Simulation/Phase/write.cpp index e8f79c6db..56b5ba0bb 100755 --- a/src/Simulation/Phase/write.cpp +++ b/src/Simulation/Phase/write.cpp @@ -48,9 +48,9 @@ void write_phase(phase_characteristics &rve, const string &path_data, const stri for(auto r : rve.sub_phases) { - r.sptr_matprops->psi_mat*=(180./sim_pi); - r.sptr_matprops->theta_mat*=(180./sim_pi); - r.sptr_matprops->phi_mat*=(180./sim_pi); + r.sptr_matprops->psi_mat*=(180./simcoon::pi); + r.sptr_matprops->theta_mat*=(180./simcoon::pi); + r.sptr_matprops->phi_mat*=(180./simcoon::pi); paramphases << r.sptr_matprops->number << "\t" << r.sptr_matprops->umat_name << "\t" << r.sptr_matprops->save << "\t" << r.sptr_shape->concentration << "\t" << r.sptr_matprops->psi_mat << "\t" << r.sptr_matprops->theta_mat << "\t" << r.sptr_matprops->phi_mat << "\t" << r.sptr_matprops->nprops << "\t" << r.sptr_sv_global->nstatev; @@ -74,14 +74,14 @@ void write_layer(phase_characteristics &rve, const string &path_data, const stri for(auto r : rve.sub_phases) { - r.sptr_matprops->psi_mat*=(180./sim_pi); - r.sptr_matprops->theta_mat*=(180./sim_pi); - r.sptr_matprops->phi_mat*=(180./sim_pi); + r.sptr_matprops->psi_mat*=(180./simcoon::pi); + r.sptr_matprops->theta_mat*=(180./simcoon::pi); + r.sptr_matprops->phi_mat*=(180./simcoon::pi); auto sptr_layer = std::dynamic_pointer_cast(r.sptr_shape); - sptr_layer->psi_geom*=(180./sim_pi); - sptr_layer->theta_geom*=(180./sim_pi); - sptr_layer->phi_geom*=(180./sim_pi); + sptr_layer->psi_geom*=(180./simcoon::pi); + sptr_layer->theta_geom*=(180./simcoon::pi); + sptr_layer->phi_geom*=(180./simcoon::pi); paramphases << r.sptr_matprops->number << "\t" << r.sptr_matprops->umat_name << "\t" << r.sptr_matprops->save << "\t" << sptr_layer->concentration << "\t" << r.sptr_matprops->psi_mat << "\t" << r.sptr_matprops->theta_mat << "\t" << r.sptr_matprops->phi_mat << "\t" << sptr_layer->psi_geom << "\t" << sptr_layer->theta_geom << "\t" << sptr_layer->phi_geom << "\t" << r.sptr_matprops->nprops << "\t" << r.sptr_sv_global->nstatev; @@ -105,14 +105,14 @@ void write_ellipsoid(phase_characteristics &rve, const string &path_data, const for(auto r : rve.sub_phases) { - r.sptr_matprops->psi_mat*=(180./sim_pi); - r.sptr_matprops->theta_mat*=(180./sim_pi); - r.sptr_matprops->phi_mat*=(180./sim_pi); + r.sptr_matprops->psi_mat*=(180./simcoon::pi); + r.sptr_matprops->theta_mat*=(180./simcoon::pi); + r.sptr_matprops->phi_mat*=(180./simcoon::pi); auto sptr_ellipsoid = std::dynamic_pointer_cast(r.sptr_shape); - sptr_ellipsoid->psi_geom*=(180./sim_pi); - sptr_ellipsoid->theta_geom*=(180./sim_pi); - sptr_ellipsoid->phi_geom*=(180./sim_pi); + sptr_ellipsoid->psi_geom*=(180./simcoon::pi); + sptr_ellipsoid->theta_geom*=(180./simcoon::pi); + sptr_ellipsoid->phi_geom*=(180./simcoon::pi); paramphases << r.sptr_matprops->number << "\t" << sptr_ellipsoid->coatingof << "\t" << r.sptr_matprops->umat_name << "\t" << r.sptr_matprops->save << "\t" << sptr_ellipsoid->concentration << "\t" << r.sptr_matprops->psi_mat << "\t" << r.sptr_matprops->theta_mat << "\t" << r.sptr_matprops->phi_mat << "\t" << sptr_ellipsoid->a1 << "\t" << sptr_ellipsoid->a2 << "\t" << sptr_ellipsoid->a3 << "\t" << sptr_ellipsoid->psi_geom << "\t" << sptr_ellipsoid->theta_geom << "\t" << sptr_ellipsoid->phi_geom << "\t" << r.sptr_matprops->nprops << "\t" << r.sptr_sv_global->nstatev; @@ -136,14 +136,14 @@ void write_cylinder(phase_characteristics &rve, const string &path_data, const s for(auto r : rve.sub_phases) { - r.sptr_matprops->psi_mat*=(180./sim_pi); - r.sptr_matprops->theta_mat*=(180./sim_pi); - r.sptr_matprops->phi_mat*=(180./sim_pi); + r.sptr_matprops->psi_mat*=(180./simcoon::pi); + r.sptr_matprops->theta_mat*=(180./simcoon::pi); + r.sptr_matprops->phi_mat*=(180./simcoon::pi); auto sptr_cylinder = std::dynamic_pointer_cast(r.sptr_shape); - sptr_cylinder->psi_geom*=(180./sim_pi); - sptr_cylinder->theta_geom*=(180./sim_pi); - sptr_cylinder->phi_geom*=(180./sim_pi); + sptr_cylinder->psi_geom*=(180./simcoon::pi); + sptr_cylinder->theta_geom*=(180./simcoon::pi); + sptr_cylinder->phi_geom*=(180./simcoon::pi); paramphases << r.sptr_matprops->number << "\t" << sptr_cylinder->coatingof << "\t" << r.sptr_matprops->umat_name << "\t" << r.sptr_matprops->save << "\t" << sptr_cylinder->concentration << "\t" << r.sptr_matprops->psi_mat << "\t" << r.sptr_matprops->theta_mat << "\t" << r.sptr_matprops->phi_mat << "\t" << sptr_cylinder->L << "\t" << sptr_cylinder->R << "\t" << sptr_cylinder->psi_geom << "\t" << sptr_cylinder->theta_geom << "\t" << sptr_cylinder->phi_geom << "\t" << r.sptr_matprops->nprops << "\t" << r.sptr_sv_global->nstatev; diff --git a/src/Simulation/Solver/read.cpp b/src/Simulation/Solver/read.cpp index 1908a202b..de4ac15fc 100755 --- a/src/Simulation/Solver/read.cpp +++ b/src/Simulation/Solver/read.cpp @@ -159,9 +159,9 @@ void read_matprops(string &umat_name, unsigned int &nprops, vec &props, unsigned return; } - psi_rve*=(sim_pi/180.); - theta_rve*=(sim_pi/180.); - phi_rve*=(sim_pi/180.); + psi_rve*=(simcoon::pi/180.); + theta_rve*=(simcoon::pi/180.); + phi_rve*=(simcoon::pi/180.); propsmat.close(); @@ -290,7 +290,7 @@ void check_path_output(const std::vector &blocks, const solver_output &so } } else if(so.o_type(i) == 2) { - if((fmod(1, so.o_tfreq(i)) > sim_limit)||(fmod(so.o_tfreq(i), sptr_meca->Dn_inc) > 0.)) { + if((fmod(1, so.o_tfreq(i)) > simcoon::limit)||(fmod(so.o_tfreq(i), sptr_meca->Dn_inc) > 0.)) { cout << "The output tfreq is not compatible with the time of increments of the step)" << endl; break; } @@ -321,7 +321,7 @@ void check_path_output(const std::vector &blocks, const solver_output &so } } else if(so.o_type(i) == 2) { - if((fmod(1, so.o_tfreq(i)) > sim_limit)||(fmod(so.o_tfreq(i), sptr_thermomeca->Dn_inc) > 0.)) { + if((fmod(1, so.o_tfreq(i)) > simcoon::limit)||(fmod(so.o_tfreq(i), sptr_thermomeca->Dn_inc) > 0.)) { cout << "The output tfreq is not compatible with the time of increments of the step)" << endl; break; } diff --git a/src/Simulation/Solver/solver.cpp b/src/Simulation/Solver/solver.cpp index e40f89c40..11a3f979e 100755 --- a/src/Simulation/Solver/solver.cpp +++ b/src/Simulation/Solver/solver.cpp @@ -306,7 +306,7 @@ void solver(const string &umat_name, const vec &props, const unsigned int &nstat sv_M->DEtot = t2v_strain(Green_Lagrange(sv_M->F1)) - sv_M->Etot; - if (DTime > sim_iota) + if (DTime > simcoon::iota) D = sv_M->Detot/DTime; else D = zeros(3,3); @@ -577,7 +577,7 @@ void solver(const string &umat_name, const vec &props, const unsigned int &nstat if(corate_type == 2) { logarithmic(sv_M->DR, D, Omega, DTime, sv_M->F0, sv_M->F1); } - if (DTime > sim_iota) + if (DTime > simcoon::iota) D = sv_M->Detot/DTime; else D = zeros(3,3); @@ -667,7 +667,7 @@ void solver(const string &umat_name, const vec &props, const unsigned int &nstat error = norm(residual, 2.); if(tnew_dt < 1.) { - if((fabs(Dtinc_cur - sptr_meca->Dn_mini) > sim_iota)||(inforce_solver == 0)) { + if((fabs(Dtinc_cur - sptr_meca->Dn_mini) > simcoon::iota)||(inforce_solver == 0)) { compteur = maxiter_solver; } } @@ -675,7 +675,7 @@ void solver(const string &umat_name, const vec &props, const unsigned int &nstat } } -/* if((fabs(Dtinc_cur - sptr_meca->Dn_mini) < sim_iota)&&(tnew_dt < 1.)) { +/* if((fabs(Dtinc_cur - sptr_meca->Dn_mini) < simcoon::iota)&&(tnew_dt < 1.)) { // cout << "The subroutine has required a step reduction lower than the minimal indicated at" << sptr_meca->number << " inc: " << inc << " and fraction:" << tinc << "\n"; //The solver has been inforced! return; @@ -1004,7 +1004,7 @@ void solver(const string &umat_name, const vec &props, const unsigned int &nstat error = norm(residual, 2.); if(tnew_dt < 1.) { - if((fabs(Dtinc_cur - sptr_thermomeca->Dn_mini) > sim_iota)||(inforce_solver == 0)) { + if((fabs(Dtinc_cur - sptr_thermomeca->Dn_mini) > simcoon::iota)||(inforce_solver == 0)) { compteur = maxiter_solver; } } @@ -1013,7 +1013,7 @@ void solver(const string &umat_name, const vec &props, const unsigned int &nstat } -/* if((fabs(Dtinc_cur - sptr_thermomeca->Dn_mini) < sim_iota)&&(tnew_dt < 1.)) { +/* if((fabs(Dtinc_cur - sptr_thermomeca->Dn_mini) < simcoon::iota)&&(tnew_dt < 1.)) { cout << "The subroutine has required a step reduction lower than the minimal indicated at" << sptr_thermomeca->number << " inc: " << inc << " and fraction:" << tinc << "\n"; //The solver has been inforced! return; diff --git a/src/Simulation/Solver/step_meca.cpp b/src/Simulation/Solver/step_meca.cpp index 2396853d1..af6381a81 100755 --- a/src/Simulation/Solver/step_meca.cpp +++ b/src/Simulation/Solver/step_meca.cpp @@ -157,7 +157,7 @@ void step_meca::generate(const double &mTime, const vec &mEtot, const vec &msigm if (mode == 2) { double sum_ = 0.; for(int k = 0 ; k < ninc ; k++){ - inc_coef(k) = cos(sim_pi+ (k+1)*2.*sim_pi/(ninc+1))+1.; + inc_coef(k) = cos(simcoon::pi+ (k+1)*2.*simcoon::pi/(ninc+1))+1.; sum_ += inc_coef(k); } inc_coef = inc_coef*ninc/sum_; @@ -307,7 +307,7 @@ void step_meca::generate_kin(const double &mTime, const mat &mF, const double &m if (mode == 2) { double sum_ = 0.; for(int k = 0 ; k < ninc ; k++){ - inc_coef(k) = cos(sim_pi+ (k+1)*2.*sim_pi/(ninc+1))+1.; + inc_coef(k) = cos(simcoon::pi+ (k+1)*2.*simcoon::pi/(ninc+1))+1.; sum_ += inc_coef(k); } inc_coef = inc_coef*ninc/sum_; diff --git a/src/Simulation/Solver/step_thermomeca.cpp b/src/Simulation/Solver/step_thermomeca.cpp index 48f3b1a4d..1f22162c3 100755 --- a/src/Simulation/Solver/step_thermomeca.cpp +++ b/src/Simulation/Solver/step_thermomeca.cpp @@ -155,7 +155,7 @@ void step_thermomeca::generate(const double &mTime, const vec &mEtot, const vec if (mode == 2) { double sum_ = 0.; for(int k = 0 ; k < ninc ; k++){ - inc_coef(k) = cos(sim_pi+ (k+1)*2.*sim_pi/(ninc+1))+1.; + inc_coef(k) = cos(simcoon::pi+ (k+1)*2.*simcoon::pi/(ninc+1))+1.; sum_ += inc_coef(k); } inc_coef = inc_coef*ninc/sum_; @@ -331,7 +331,7 @@ void step_thermomeca::generate_kin(const double &mTime, const mat &mF, const dou if (mode == 2) { double sum_ = 0.; for(int k = 0 ; k < ninc ; k++){ - inc_coef(k) = cos(sim_pi+ (k+1)*2.*sim_pi/(ninc+1))+1.; + inc_coef(k) = cos(simcoon::pi+ (k+1)*2.*simcoon::pi/(ninc+1))+1.; sum_ += inc_coef(k); } inc_coef = inc_coef*ninc/sum_; diff --git a/test/Identification/Tidentification.cpp b/test/Identification/Tidentification.cpp index a96b591cd..cb6571290 100755 --- a/test/Identification/Tidentification.cpp +++ b/test/Identification/Tidentification.cpp @@ -101,7 +101,7 @@ TEST(Tidentification, identification_layers) read_layer(rve_layer_0, path_results, "Nlayers0.dat"); for(unsigned int i=0; iprops(i)) > sim_iota) { + if (fabs(rve_layer_0.sptr_matprops->props(i)) > simcoon::iota) { EXPECT_LT( pow(pow(rve_layer_0.sptr_matprops->props(i),2.) - pow(rve_layer_1.sptr_matprops->props(i),2.),0.5)/fabs(rve_layer_0.sptr_matprops->props(i)),1.E-6); } else { diff --git a/test/Libraries/Continuum_mechanics/Tcontimech.cpp b/test/Libraries/Continuum_mechanics/Tcontimech.cpp index 0a555f807..156297c6e 100755 --- a/test/Libraries/Continuum_mechanics/Tcontimech.cpp +++ b/test/Libraries/Continuum_mechanics/Tcontimech.cpp @@ -42,8 +42,8 @@ TEST(Tcontimech, dev_sph) mat testsph = (1./3.)*eye(3,3); - EXPECT_LT(norm(sph(test) - testsph,2),sim_iota); - EXPECT_LT(norm(dev(test) - testdev,2),sim_iota); + EXPECT_LT(norm(sph(test) - testsph,2),simcoon::iota); + EXPECT_LT(norm(dev(test) - testdev,2),simcoon::iota); } TEST(Tcontimech, tr_dev_Mises_eta) @@ -60,8 +60,8 @@ TEST(Tcontimech, tr_dev_Mises_eta) //Test of tr function double tr1 = tr(zeros(6)); double tr2 = tr(test); - EXPECT_LT(fabs(tr1 - 0.),sim_iota); - EXPECT_LT(fabs(tr2 - 12.),sim_iota); + EXPECT_LT(fabs(tr1 - 0.),simcoon::iota); + EXPECT_LT(fabs(tr2 - 12.),simcoon::iota); //Test of dev function vec vide = zeros(6); @@ -75,12 +75,12 @@ TEST(Tcontimech, tr_dev_Mises_eta) testdev(3) = 8.; testdev(4) = 3.; testdev(5) = 7.; - EXPECT_LT(fabs(trdev2 - 0.),sim_iota); - EXPECT_LT(norm(dev2 - testdev,2),sim_iota); + EXPECT_LT(fabs(trdev2 - 0.),simcoon::iota); + EXPECT_LT(norm(dev2 - testdev,2),simcoon::iota); //Test of Mises_stress function double dstress = 3.*sqrt(42.); - EXPECT_LT(fabs(Mises_stress(test) - dstress),sim_iota); + EXPECT_LT(fabs(Mises_stress(test) - dstress),simcoon::iota); //Test of eta_stress function dev1 = eta_stress(zeros(6)); @@ -92,18 +92,18 @@ TEST(Tcontimech, tr_dev_Mises_eta) testeta(3) = 8.*2; testeta(4) = 3.*2; testeta(5) = 7.*2; - EXPECT_LT(norm(dev1,2),sim_iota); - EXPECT_LT(norm(dev2 - (3./2.)*testeta/dstress,2),sim_iota); + EXPECT_LT(norm(dev1,2),simcoon::iota); + EXPECT_LT(norm(dev2 - (3./2.)*testeta/dstress,2),simcoon::iota); //Test of Mises_strain function double dstrain = sqrt(46.); - EXPECT_LT(fabs(Mises_strain(test) - dstrain),sim_iota); + EXPECT_LT(fabs(Mises_strain(test) - dstrain),simcoon::iota); //Test of eta_strain function dev1 = eta_strain(zeros(6)); dev2 = eta_strain(test); - EXPECT_LT(norm(dev1,2),sim_iota); - EXPECT_LT(norm(dev2 - (2./3.)*testdev/dstrain,2),sim_iota); + EXPECT_LT(norm(dev1,2),simcoon::iota); + EXPECT_LT(norm(dev2 - (2./3.)*testdev/dstrain,2),simcoon::iota); } @@ -121,26 +121,26 @@ TEST(Tcontimech, J2_J3) //Test of J2_stress function double J2_stress1 = J2_stress(zeros(6)); double J2_stress2 = J2_stress(test); - EXPECT_LT(fabs(J2_stress1),sim_iota); - EXPECT_LT(fabs(J2_stress2 - 126.),sim_iota); + EXPECT_LT(fabs(J2_stress1),simcoon::iota); + EXPECT_LT(fabs(J2_stress2 - 126.),simcoon::iota); //Test of J2_strain function double J2_strain1 = J2_strain(zeros(6)); double J2_strain2 = J2_strain(test); - EXPECT_LT(fabs(J2_strain1),sim_iota); - EXPECT_LT(fabs(J2_strain2 - 34.5),sim_iota); + EXPECT_LT(fabs(J2_strain1),simcoon::iota); + EXPECT_LT(fabs(J2_strain2 - 34.5),simcoon::iota); //Test of J3_stress function double J3_stress1 = J3_stress(zeros(6)); double J3_stress2 = J3_stress(test); - EXPECT_LT(fabs(J3_stress1),sim_iota); - EXPECT_LT(fabs(J3_stress2 - 226.),sim_iota); + EXPECT_LT(fabs(J3_stress1),simcoon::iota); + EXPECT_LT(fabs(J3_stress2 - 226.),simcoon::iota); //Test of J3_stress function double J3_strain1 = J3_strain(zeros(6)); double J3_strain2 = J3_strain(test); - EXPECT_LT(fabs(J3_strain1),sim_iota); - EXPECT_LT(fabs(J3_strain2 - 14.5),sim_iota); + EXPECT_LT(fabs(J3_strain1),simcoon::iota); + EXPECT_LT(fabs(J3_strain2 - 14.5),simcoon::iota); } @@ -171,21 +171,21 @@ TEST(Tcontimech, ellipsoid) vec sigma_in = {4., 5., 6., 2., 1., 1.5}; vec test_sig_int = {5.,2.5}; vec normal = normal_ellipsoid(u,v,a1,a2,a3); - EXPECT_LT(norm(normal-test,2),sim_iota); + EXPECT_LT(norm(normal-test,2),simcoon::iota); u = 0.; - v =sim_pi/2.; + v =simcoon::pi/2.; test = { 1, 0, 0 }; normal = normal_ellipsoid(u,v,a1,a2,a3); - EXPECT_LT(norm(normal-test,2),sim_iota); + EXPECT_LT(norm(normal-test,2),simcoon::iota); - u =sim_pi/2.; - v =sim_pi/2.; + u =simcoon::pi/2.; + v =simcoon::pi/2.; test = { 0, 1, 0 }; normal = normal_ellipsoid(u,v,a1,a2,a3); - EXPECT_LT(norm(normal-test,2),sim_iota); + EXPECT_LT(norm(normal-test,2),simcoon::iota); vec sig_int = sigma_int(sigma_in,u,v,a1,a2,a3); - EXPECT_LT(norm(sig_int-test_sig_int,2),sim_iota); + EXPECT_LT(norm(sig_int-test_sig_int,2),simcoon::iota); } TEST(Tcontimech, P_ijkl) @@ -260,7 +260,7 @@ TEST(Tcontimech, P_ijkl) mat pikjla = p_ikjl(a); mat pikjlb = p_ikjl(b); - EXPECT_LT(norm(pikjla - Ireal,2),sim_iota); - EXPECT_LT(norm(pikjlb - ones(6,6),2),sim_iota); - EXPECT_LT(norm(pikjlc - result,2),sim_iota); + EXPECT_LT(norm(pikjla - Ireal,2),simcoon::iota); + EXPECT_LT(norm(pikjlb - ones(6,6),2),simcoon::iota); + EXPECT_LT(norm(pikjlc - result,2),simcoon::iota); } diff --git a/test/Libraries/Continuum_mechanics/Tcriteria.cpp b/test/Libraries/Continuum_mechanics/Tcriteria.cpp index 07b5a94ac..12c12725f 100755 --- a/test/Libraries/Continuum_mechanics/Tcriteria.cpp +++ b/test/Libraries/Continuum_mechanics/Tcriteria.cpp @@ -38,10 +38,10 @@ TEST(Tcriteria, Aniso) //Check that Tresca is equal to 400 in that case double test_tresca = Tresca_stress(sigma); - EXPECT_LT(test_tresca - 400.,sim_iota); + EXPECT_LT(test_tresca - 400.,simcoon::iota); //Check that Prager is equal to 400 in that case double test_prager = Prager_stress(sigma, b, n); - EXPECT_LT(test_prager - 400.,sim_iota); + EXPECT_LT(test_prager - 400.,simcoon::iota); } \ No newline at end of file diff --git a/test/Libraries/Continuum_mechanics/Tobjective_rates.cpp b/test/Libraries/Continuum_mechanics/Tobjective_rates.cpp index 5bf24ed37..09ae375b3 100755 --- a/test/Libraries/Continuum_mechanics/Tobjective_rates.cpp +++ b/test/Libraries/Continuum_mechanics/Tobjective_rates.cpp @@ -67,7 +67,7 @@ TEST(Tobjective_rates, get_B) double f_z = 0.; for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { - if ((i!=j)&&(fabs(bi(i)-bi(j))>sim_iota)) { + if ((i!=j)&&(fabs(bi(i)-bi(j))>simcoon::iota)) { Bij = Bi.col(i)*(Bi.col(j)).t(); Bij_ = mat_FTensor2(Bij); f_z = (1.+(bi(i)/bi(j)))/(1.-(bi(i)/bi(j)))+2./log(bi(i)/bi(j)); @@ -140,7 +140,7 @@ TEST(Tobjective_rates, logarithmic_functions) BBBB_(k,l,m,n) = Bij_(k,l)*Bij_(m,n); for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { - if ((i!=j)&&(fabs(bi(i)-bi(j))>sim_iota)) { + if ((i!=j)&&(fabs(bi(i)-bi(j))>simcoon::iota)) { Bij = Bi.col(i)*(Bi.col(j)).t(); Bij_ = mat_FTensor2(Bij); f_z = (1.+(bi(i)/bi(j)))/(1.-(bi(i)/bi(j)))+2./log(bi(i)/bi(j)); diff --git a/test/Libraries/Continuum_mechanics/Ttransfer.cpp b/test/Libraries/Continuum_mechanics/Ttransfer.cpp index b424c7ba2..9411fc27c 100755 --- a/test/Libraries/Continuum_mechanics/Ttransfer.cpp +++ b/test/Libraries/Continuum_mechanics/Ttransfer.cpp @@ -69,27 +69,27 @@ TEST(Ttransfer, v2t_func) //Test of v2t_strain function strain = v2t_strain(zeros(6)); - EXPECT_LT(norm(strain,2),sim_iota); + EXPECT_LT(norm(strain,2),simcoon::iota); strain = v2t_strain(test); - EXPECT_LT(norm(strain - teststrain,2),sim_iota); + EXPECT_LT(norm(strain - teststrain,2),simcoon::iota); //Test of t2v_strain function vec dev1 = t2v_strain(zeros(3,3)); vec dev2 = t2v_strain(teststrain); - EXPECT_LT(norm(dev1,2),sim_iota); - EXPECT_LT(norm(dev2 - test,2),sim_iota); + EXPECT_LT(norm(dev1,2),simcoon::iota); + EXPECT_LT(norm(dev2 - test,2),simcoon::iota); //Test of v2t_stress function stress = v2t_stress(zeros(6)); - EXPECT_LT(norm(stress,2),sim_iota); + EXPECT_LT(norm(stress,2),simcoon::iota); stress = v2t_stress(test); - EXPECT_LT(norm(stress - teststress,2),sim_iota); + EXPECT_LT(norm(stress - teststress,2),simcoon::iota); //Test of t2v_stress function dev1 = t2v_stress(zeros(3,3)); dev2 = t2v_stress(teststress); - EXPECT_LT(norm(dev1,2),sim_iota); - EXPECT_LT(norm(dev2 - test,2),sim_iota); + EXPECT_LT(norm(dev1,2),simcoon::iota); + EXPECT_LT(norm(dev2 - test,2),simcoon::iota); } @@ -174,9 +174,9 @@ TEST(Ttransfer, FTensor_transfer) C = mat_FTensor4(L); mat L2 = FTensor4_mat(C); - EXPECT_LT(norm(testmat2 - testmat,2),sim_iota); - EXPECT_LT(norm(test_strain - test,2),sim_iota); - EXPECT_LT(norm(test_stress - test,2),sim_iota); - EXPECT_LT(norm(L2 - L,2),sim_iota); + EXPECT_LT(norm(testmat2 - testmat,2),simcoon::iota); + EXPECT_LT(norm(test_strain - test,2),simcoon::iota); + EXPECT_LT(norm(test_stress - test,2),simcoon::iota); + EXPECT_LT(norm(L2 - L,2),simcoon::iota); } diff --git a/test/Libraries/Maths/Trotation.cpp b/test/Libraries/Maths/Trotation.cpp index 4659fc780..fb108be19 100755 --- a/test/Libraries/Maths/Trotation.cpp +++ b/test/Libraries/Maths/Trotation.cpp @@ -38,9 +38,9 @@ TEST(Trotation, basic_rotation) double theta = 42.; double phi = 165; - psi *= (sim_pi/180.); - theta *= (sim_pi/180.); - phi *= (sim_pi/180.); + psi *= (simcoon::pi/180.); + theta *= (simcoon::pi/180.); + phi *= (simcoon::pi/180.); mat R1 = { {cos(psi),-sin(psi),0}, {sin(psi),cos(psi), 0}, {0,0,1}}; mat R2 = { {1,0,0}, {0,cos(theta),-sin(theta)}, {0,sin(theta),cos(theta)} }; @@ -93,9 +93,9 @@ TEST(Trotation, rotation) double theta = 32.; double phi = -4.5; - psi *= (sim_pi/180.); - theta *= (sim_pi/180.); - phi *= (sim_pi/180.); + psi *= (simcoon::pi/180.); + theta *= (simcoon::pi/180.); + phi *= (simcoon::pi/180.); //Rotation mat R1 = { {cos(psi),-sin(psi),0}, {sin(psi),cos(psi), 0}, {0,0,1}}; From 70540b4472ed997d33ee0d06b8ba6422c8c492b1 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Thu, 17 Apr 2025 11:19:47 +0200 Subject: [PATCH 14/46] Update parameter.hpp --- include/simcoon/parameter.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/simcoon/parameter.hpp b/include/simcoon/parameter.hpp index 11090663a..0a725b073 100755 --- a/include/simcoon/parameter.hpp +++ b/include/simcoon/parameter.hpp @@ -42,8 +42,8 @@ constexpr axis_psi 3 constexpr axis_theta 1 constexpr axis_phi 3 -constexpr sim_limit 1.E-9 -constexpr sim_iota 1.E-12 +constexpr limit 1.E-9 +constexpr iota 1.E-12 constexpr miniter_umat 10 constexpr maxiter_umat 100 From 922613d33575f4923b9c31eaaee4cecbd35c8715 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Thu, 17 Apr 2025 14:08:43 +0200 Subject: [PATCH 15/46] Update parameter.hpp --- include/simcoon/parameter.hpp | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/include/simcoon/parameter.hpp b/include/simcoon/parameter.hpp index 0a725b073..9af5437e1 100755 --- a/include/simcoon/parameter.hpp +++ b/include/simcoon/parameter.hpp @@ -19,6 +19,7 @@ ///@brief parameters of simcoon ///@version 1.0 +#pragma once #if __has_include() #include #define HAS_STD_NUMBERS @@ -26,10 +27,6 @@ #define UNUSED(x) [&x]{}() -#ifndef version_full -#define version_full 1 -#endif - namespace simcoon{ #ifdef HAS_STD_NUMBERS @@ -38,21 +35,21 @@ namespace simcoon{ constexpr double pi = 3.14159265358979323846; #endif -constexpr axis_psi 3 -constexpr axis_theta 1 -constexpr axis_phi 3 +constexpr int axis_psi = 3; +constexpr int axis_theta = 1; +constexpr int axis_phi = 3; -constexpr limit 1.E-9 -constexpr iota 1.E-12 -constexpr miniter_umat 10 +constexpr double limit = 1.E-9; +constexpr double iota = 1.E-12; +constexpr int miniter_umat = 10; -constexpr maxiter_umat 100 -constexpr precision_umat 1E-9 +constexpr int maxiter_umat = 100; +constexpr double precision_umat = 1E-9; -constexpr div_tnew_dt_umat 0.2 -constexpr mul_tnew_dt_umat 2 -constexpr maxiter_micro 100 +constexpr double div_tnew_dt_umat = 0.2; +constexpr double mul_tnew_dt_umat = 2.0; +constexpr int maxiter_micro = 100; -constexpr precision_micro 1E-6 +constexpr double precision_micro = 1E-6; } //namespace simcoon From 8df71f31502ce53302987dde45a25ba697ae1b75 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Thu, 17 Apr 2025 14:08:49 +0200 Subject: [PATCH 16/46] Update recovery_props.cpp --- src/Continuum_mechanics/Functions/recovery_props.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Continuum_mechanics/Functions/recovery_props.cpp b/src/Continuum_mechanics/Functions/recovery_props.cpp index 48dd872cc..996d46cf3 100755 --- a/src/Continuum_mechanics/Functions/recovery_props.cpp +++ b/src/Continuum_mechanics/Functions/recovery_props.cpp @@ -34,9 +34,9 @@ namespace simcoon{ void check_symetries(const mat &L, std::string &umat_type, int &axis, vec &props, int &maj_sym, const double &tol) { - double max_tol_simcoon::limit = simcoon::limit; + double max_tol_sim = simcoon::limit; if(tol > simcoon::limit) { - max_tol_simcoon::limit = tol; + max_tol_sim = tol; } axis = 0; //Indicate no preferential axis @@ -92,14 +92,14 @@ void check_symetries(const mat &L, std::string &umat_type, int &axis, vec &props for (unsigned int i=0; i Date: Tue, 22 Apr 2025 15:16:39 +0200 Subject: [PATCH 17/46] add exception for det and inv (not finished) --- include/simcoon/exception.hpp | 12 ++ .../Functions/derivatives.cpp | 19 +++- .../Functions/hyperelastic.cpp | 105 +++++++++++++++--- .../Functions/objective_rates.cpp | 58 ++++++++-- src/Continuum_mechanics/Functions/stress.cpp | 56 ++++++++-- .../Umat/Finite/Neo_hookean_comp.cpp | 8 +- .../Umat/Finite/Neo_hookean_incomp.cpp | 8 +- .../Umat/Finite/generic_hyper_invariants.cpp | 8 +- .../Umat/Finite/generic_hyper_pstretch.cpp | 8 +- .../Umat/Finite/mooney_rivlin.cpp | 8 +- .../Umat/Mechanical/SMA/SMA_mono.cpp | 25 +++-- .../Umat/Mechanical/SMA/SMA_mono_cubic.cpp | 24 ++-- src/Simulation/Maths/num_solve.cpp | 87 +++++++++------ .../Continuum_mechanics/Thyperelastic.cpp | 17 ++- 14 files changed, 358 insertions(+), 85 deletions(-) diff --git a/include/simcoon/exception.hpp b/include/simcoon/exception.hpp index ba30453c6..d80857482 100755 --- a/include/simcoon/exception.hpp +++ b/include/simcoon/exception.hpp @@ -32,4 +32,16 @@ class exception_eig_sym : public std::runtime_error { : std::runtime_error(msg) {} }; +class exception_det : public std::runtime_error { + public: + explicit exception_det(const std::string& msg) + : std::runtime_error(msg) {} + }; + +class exception_inv : public std::runtime_error { + public: + explicit exception_inv(const std::string& msg) + : std::runtime_error(msg) {} + }; + } //namespace simcoon diff --git a/src/Continuum_mechanics/Functions/derivatives.cpp b/src/Continuum_mechanics/Functions/derivatives.cpp index 494536062..91268e790 100755 --- a/src/Continuum_mechanics/Functions/derivatives.cpp +++ b/src/Continuum_mechanics/Functions/derivatives.cpp @@ -58,13 +58,26 @@ mat dtrSdS(const mat &S) { //This function returns the derivative of the determinant of a tensor mat ddetSdS(const mat &S) { - return det(S)*(inv(S)).t(); + + try { + return det(S)*(inv(S)).t(); + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv (combined expression), error inv is thrown: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside ddetSdS."); + } } mat dinvSdSsym(const mat &S) { - mat invS = inv(S); - + mat invS; + + try { + invS = inv(S); + } catch (const std::runtime_error &e) { + cerr << "Error in inv : " << e.what() << endl; + throw simcoon::exception_inv("Error in eig_sym function inside dinvSdSsym."); + } + Tensor2 invS_ = mat_FTensor2(invS); Tensor4 dinvSdSsym_; diff --git a/src/Continuum_mechanics/Functions/hyperelastic.cpp b/src/Continuum_mechanics/Functions/hyperelastic.cpp index 2c8b9e0b4..f983b8c52 100755 --- a/src/Continuum_mechanics/Functions/hyperelastic.cpp +++ b/src/Continuum_mechanics/Functions/hyperelastic.cpp @@ -35,7 +35,12 @@ vec isochoric_invariants(const mat &b, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(b)); + try { + J = sqrt(det(b)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside isochoric_invariants."); + } } mat b_bar = pow(J,-2./3.)*b; vec I = zeros(3); @@ -62,7 +67,12 @@ vec isochoric_invariants(const vec &lambda, const double &mJ) { vec isochoric_pstretch_from_V(const mat &V, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = det(V); + try { + J = det(V); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside isochoric_pstretch_from_V."); + } } vec lambda; try { @@ -79,7 +89,12 @@ vec isochoric_pstretch_from_b(const mat &b, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(b)); + try { + J = sqrt(det(b)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside isochoric_pstretch_from_b."); + } } vec lambda; try { @@ -108,7 +123,12 @@ void pstretch(vec &lambda, mat &n_pvectors, const mat &input, const string &inpu double J=mJ; if (input_tensor == "b") { if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(input)); + try { + J = sqrt(det(input)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside pstretch."); + } } bool success_eig_sym = eig_sym(lambda, n_pvectors, input); if (!success_eig_sym) { @@ -118,7 +138,12 @@ void pstretch(vec &lambda, mat &n_pvectors, const mat &input, const string &inpu } else if (input_tensor == "v" || input_tensor == "V") { if (fabs(mJ) < simcoon::iota) { - J = det(input); + try { + J = sqrt(det(input)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside pstretch."); + } } bool success_eig_sym = eig_sym(lambda, n_pvectors, input); if (!success_eig_sym) { @@ -145,7 +170,12 @@ void isochoric_pstretch(vec &lambda_bar, mat &n_pvectors, const mat &input, cons if (input_tensor == "b") { if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(input)); + try { + J = sqrt(det(input)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside isochoric_pstretch."); + } } bool success_eig_sym = eig_sym(lambda, n_pvectors, input); if (!success_eig_sym) { @@ -155,7 +185,12 @@ void isochoric_pstretch(vec &lambda_bar, mat &n_pvectors, const mat &input, cons } else if (input_tensor == "v" || input_tensor == "V") { if (fabs(mJ) < simcoon::iota) { - J = det(input); + try { + J = sqrt(det(input)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside isochoric_pstretch."); + } } bool success_eig_sym = eig_sym(lambda, n_pvectors, input); if (!success_eig_sym) { @@ -229,7 +264,12 @@ mat sigma_iso_hyper_pstretch(const vec &dWdlambda_bar, const mat &b, const doubl double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(b)); + try { + J = sqrt(det(b)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside sigma_iso_hyper_pstretch."); + } } vec lambda_bar = zeros(3); vec n_pvectors = zeros(3); @@ -290,7 +330,12 @@ vec delta_coefs(const vec &a_coefs, const vec &b_coefs, const mat &b) { mat tau_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_bar, const mat &b, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(b)); + try { + J = sqrt(det(b)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside tau_iso_hyper_invariants."); + } } mat b_bar = pow(J,-2./3.)*b; mat b_bar2 = powmat(b_bar,2); @@ -300,7 +345,12 @@ mat tau_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_bar, mat tau_vol_hyper(const double &dUdJ, const mat &b, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(b)); + try { + J = sqrt(det(b)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside tau_vol_hyper."); + } } mat Id = eye(3,3); return J*dUdJ*eye(3,3); @@ -309,7 +359,12 @@ mat tau_vol_hyper(const double &dUdJ, const mat &b, const double &mJ) { mat sigma_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_bar, const mat &b, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(b)); + try { + J = sqrt(det(b)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside sigma_iso_hyper_invariants."); + } } mat b_bar = pow(J,-2./3.)*b; mat b_bar2 = powmat(b_bar,2); @@ -319,7 +374,12 @@ mat sigma_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_ba mat sigma_vol_hyper(const double &dUdJ, const mat &b, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(b)); + try { + J = sqrt(det(b)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside sigma_vol_hyper."); + } } mat Id = eye(3,3); return dUdJ*eye(3,3); @@ -408,7 +468,12 @@ mat L_iso_hyper_pstretch(const vec &dWdlambda_bar, const mat &dW2dlambda_bar2, c double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(b)); + try { + J = sqrt(det(b)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside L_iso_hyper_pstretch."); + } } vec lambda; @@ -453,7 +518,12 @@ mat L_iso_hyper_pstretch(const vec &dWdlambda_bar, const mat &dW2dlambda_bar2, c mat L_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_bar, const double &dW2dI_11_bar, const double &dW2dI_12_bar, const double &dW2dI_22_bar, const mat &b, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(b)); + try { + J = sqrt(det(b)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside L_iso_hyper_invariants."); + } } mat b_bar = pow(J,-2./3.)*b; mat b_bar2 = powmat(b_bar,2); @@ -478,7 +548,12 @@ mat L_iso_hyper_invariants(const double &dWdI_1_bar, const double &dWdI_2_bar, c mat L_vol_hyper(const double &dUdJ, const double &dU2dJ2, const mat &b, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = sqrt(det(b)); + try { + J = sqrt(det(b)); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside L_vol_hyper."); + } } return (dUdJ+dU2dJ2*J)*3.*Ivol() - 2.*dUdJ*Ireal(); } diff --git a/src/Continuum_mechanics/Functions/objective_rates.cpp b/src/Continuum_mechanics/Functions/objective_rates.cpp index f6049e999..3d4e7f051 100755 --- a/src/Continuum_mechanics/Functions/objective_rates.cpp +++ b/src/Continuum_mechanics/Functions/objective_rates.cpp @@ -362,38 +362,64 @@ mat DtauDe_JaumannDD_2_DSDE(const mat &Lt, const mat &F, const mat &tau){ //This function computes the tangent modulus that links the Piola-Kirchoff II stress S to the Green-Lagrange stress E to the tangent modulus that links the Kirchoff elastic tensor and logarithmic strain, through the log rate and the and the transformation gradient F mat DsigmaDe_2_DSDE(const mat &Lt, const mat &B, const mat &F, const mat &sigma){ - double J = det(F); + double J; + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside DsigmaDe_2_DSDE."); + } return J*DtauDe_2_DSDE(Lt, B, F, Cauchy2Kirchoff(sigma, F, J)); } //This function computes the tangent modulus that links the Piola-Kirchoff II stress S to the Green-Lagrange stress E to the tangent modulus that links the Kirchoff elastic tensor and logarithmic strain, through the log rate and the and the transformation gradient F mat DsigmaDe_2_DSDE(const mat &Lt, const mat &F, const mat &sigma){ - double J = det(F); + double J; + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside DsigmaDe_2_DSDE."); + } mat B = get_BBBB(F); return J*DtauDe_2_DSDE(Lt, B, F, Cauchy2Kirchoff(sigma, F, J)); } mat Dsigma_LieDD_2_DSDE(const mat &Lt, const mat &F){ - double J = det(F); + double J; + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside Dsigma_LieDD_2_DSDE."); + } return J*Dtau_LieDD_2_DSDE(Lt, F); } mat DsigmaDe_JaumannDD_2_DSDE(const mat &Lt, const mat &F, const mat &sigma){ - double J = det(F); + double J; + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside DsigmaDe_JaumannDD_2_DSDE."); + } return J*DtauDe_JaumannDD_2_DSDE(Lt, F, Cauchy2Kirchoff(sigma, F, J)); } mat DtauDe_2_DsigmaDe(const mat &Lt, const double &J) { + assert(J > simcoon::iota); return (1./J)*Lt; } mat DsigmaDe_2_DtauDe(const mat &Lt, const double &J) { + assert(J > simcoon::iota); return Lt*J; } @@ -425,7 +451,13 @@ mat DSDE_2_DtauDe(const mat &DSDE, const mat &B, const mat &F, const mat &tau) { mat DSDE_2_DsigmaDe(const mat &DSDE, const mat &B, const mat &F, const mat &sigma) { - double J = det(F); + double J; + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside DSDE_2_DsigmaDe."); + } return (1./J)*DSDE_2_DtauDe(DSDE, B, F, Cauchy2Kirchoff(sigma, F, J)); } @@ -452,7 +484,13 @@ mat DSDE_2_Dtau_LieDD(const mat &DSDE, const mat &F) { mat DSDE_2_DsigmaDe_LieDD(const mat &DSDE, const mat &F) { - double J = det(F); + double J; + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside DSDE_2_DsigmaDe_LieDD."); + } return (1./J)*DSDE_2_Dtau_LieDD(DSDE, F); } @@ -481,7 +519,13 @@ mat DSDE_2_Dtau_JaumannDD(const mat &DSDE, const mat &F, const mat &tau) { mat DSDE_2_Dsigma_JaumannDD(const mat &DSDE, const mat &F, const mat &sigma) { - double J = det(F); + double J; + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside DSDE_2_Dsigma_JaumannDD."); + } return (1./J)*DSDE_2_Dtau_JaumannDD(DSDE, F, Cauchy2Kirchoff(sigma, F, J)); } diff --git a/src/Continuum_mechanics/Functions/stress.cpp b/src/Continuum_mechanics/Functions/stress.cpp index b3e223a42..2af3b68fe 100755 --- a/src/Continuum_mechanics/Functions/stress.cpp +++ b/src/Continuum_mechanics/Functions/stress.cpp @@ -34,7 +34,12 @@ mat Cauchy2PKI(const mat &sigma, const mat &F, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = det(F); + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside Cauchy2PKI."); + } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 if (fabs(J) < simcoon::iota) { @@ -63,7 +68,12 @@ mat Cauchy2PKII(const mat &sigma, const mat &F, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = det(F); + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside Cauchy2PKII."); + } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 if (fabs(J) < simcoon::iota) { @@ -79,7 +89,12 @@ mat Cauchy2Kirchoff(const mat &sigma, const mat &F, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = det(F); + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside Cauchy2Kirchoff."); + } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 if (fabs(J) < simcoon::iota) { @@ -96,7 +111,12 @@ vec Cauchy2Kirchoff(const vec &sigma, const mat &F, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = det(F); + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside Cauchy2Kirchoff."); + } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 if (fabs(J) < simcoon::iota) { @@ -113,7 +133,12 @@ mat Kirchoff2Cauchy(const mat &tau, const mat &F, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = det(F); + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside Kirchoff2Cauchy."); + } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 if (fabs(J) < simcoon::iota) { @@ -129,7 +154,12 @@ vec Kirchoff2Cauchy(const vec& tau, const mat& F, const double& mJ) { double J = mJ; if (fabs(mJ) < simcoon::iota) { - J = det(F); + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside Kirchoff2Cauchy."); + } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 if (fabs(J) < simcoon::iota) { @@ -181,7 +211,12 @@ mat PKI2Cauchy(const mat &Sigma, const mat &F, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = det(F); + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside PKI2Cauchy."); + } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 if (fabs(J) < simcoon::iota) { @@ -197,7 +232,12 @@ mat PKII2Cauchy(const mat &S, const mat &F, const double &mJ) { double J=mJ; if (fabs(mJ) < simcoon::iota) { - J = det(F); + try { + J = det(F); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside PKII2Cauchy."); + } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 if (fabs(J) < simcoon::iota) { diff --git a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp index 8e2472e09..249321c0f 100755 --- a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp +++ b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp @@ -84,7 +84,13 @@ void umat_neo_hookean_comp(const vec &Etot, const vec &DEtot, const mat &F0, con //Invariants of C double I1 = trace(C); // pow(lambda_alpha(2),2.) + pow(lambda_alpha(1),2.) + pow(lambda_alpha(0),2.); //ascending order - double J = det(F1); //lambda(2)*lambda(1)*lambda(0) + double J; + try { + J = det(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in det function inside umat_neo_hookean_comp."); + } double W = mu/2.0*(I1-3.) - mu*log(J) + lambda/2.0*pow(log(J),2.); diff --git a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp index ac703c234..b2cc24dce 100755 --- a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp +++ b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp @@ -83,7 +83,13 @@ void umat_neo_hookean_incomp(const vec &etot, const vec &Detot, const mat &F0, c //Invariants of C double I1 = trace(C); // pow(lambda_alpha(2),2.) + pow(lambda_alpha(1),2.) + pow(lambda_alpha(0),2.); //ascending order - double J = det(F1); //lambda(2)*lambda(1)*lambda(0) + double J; + try { + J = det(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside umat_neo_hookean_incomp."); + } double I1_bar = pow(J,-2./3.)*I1; double W = C_10*(I1_bar-3.) + (1./D_1)*pow(J-1.,2.); diff --git a/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp b/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp index 859b28b16..702013c78 100755 --- a/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp +++ b/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp @@ -73,7 +73,13 @@ void umat_generic_hyper_invariants(const std::string &umat_name, const vec &etot double dUdJ = 0.; double dU2dJ2 = 0.; - double J = det(F1); + double J; + try { + J = det(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside umat_generic_hyper_invariants."); + } vec I_bar = isochoric_invariants(b, J); std::map list_potentials; diff --git a/src/Continuum_mechanics/Umat/Finite/generic_hyper_pstretch.cpp b/src/Continuum_mechanics/Umat/Finite/generic_hyper_pstretch.cpp index b45483756..9aa3748d3 100755 --- a/src/Continuum_mechanics/Umat/Finite/generic_hyper_pstretch.cpp +++ b/src/Continuum_mechanics/Umat/Finite/generic_hyper_pstretch.cpp @@ -66,7 +66,13 @@ void umat_generic_hyper_pstretch(const std::string &umat_name, const vec &etot, double dUdJ = 0.; double dU2dJ2 = 0.; - double J = det(F1); + double J; + try { + J = det(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside umat_generic_hyper_pstretch."); + } vec dWdlambda_bar = zeros(3); mat dW2dlambda_bar2 = eye(3,3); diff --git a/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp b/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp index f22455ae1..102a667f1 100755 --- a/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp +++ b/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp @@ -83,7 +83,13 @@ void umat_mooney_rivlin(const vec &Etot, const vec &DEtot, const mat &F0, const //Invariants of C double I1 = trace(C); // pow(lambda_alpha(2),2.) + pow(lambda_alpha(1),2.) + pow(lambda_alpha(0),2.); //ascending order - double J = det(F1); //lambda(2)*lambda(1)*lambda(0) + double J; + try { + J = det(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in det: " << e.what() << endl; + throw simcoon::exception_det("Error in eig_sym function inside umat_mooney_rivlin."); + } double I1_bar = pow(J,-2./3.)*I1; double W = C_10*(I1_bar-3.) + (1./D_1)*pow(J-1.,2.); diff --git a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp index 0d1cfdac3..114734e24 100644 --- a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp @@ -320,13 +320,18 @@ void umat_sma_mono(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, mat & // Assemble the derivatives (CCP algorithm) dPhidxi += dPhidsigma*(-1.*L*lambda); - if(fabs(det(dPhidxi)) > 0.) + try { + if(fabs(det(dPhidxi)) > 0.) dxin = -1.*inv(dPhidxi)*Phi; else { //pnewdt = 0.1; // Phi = zeros(nactive); dxin = zeros(nactive); } + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv: throw inv exception " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside umat_sma_mono."); + } dxi = 0.; for(int i=0; i 0.)&&(fabs(xi - xi_start) > 1.E-5)) { - if(fabs(det(dPhidxi)) > 0.) { - Lt = L + ((L*lambda)*(inv(dPhidxi))*(dPhidsigma*L)); - } - else - Lt = L; + //Computation of the tangent modulus ! + try { + if(fabs(det(dPhidxi)) > 0.) { + Lt = L + ((L*lambda)*(inv(dPhidxi))*(dPhidsigma*L)); + } + else + Lt = L; + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv: throw inv exception " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside umat_sma_mono."); + } + /* ///Note : To use with Self-consistent micromechanics only! vec eigval = eig_sym(Lt); diff --git a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp index 037644e10..13a54b4b7 100644 --- a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp @@ -324,13 +324,18 @@ void umat_sma_mono_cubic(const vec &Etot, const vec &DEtot, vec &sigma, mat &Lt, // Assemble the derivatives (CCP algorithm) dPhidxi += dPhidsigma*(-1.*L*lambda); - if(fabs(det(dPhidxi)) > 0.) + try { + if(fabs(det(dPhidxi)) > 0.) dxin = -1.*inv(dPhidxi)*Phi; else { //pnewdt = 0.1; // Phi = zeros(nactive); dxin = zeros(nactive); } + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv: throw inv exception " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside umat_sma_mono_cubic."); + } dxi = 0.; for(int i=0; i 0.)&&(fabs(xi - xi_start) > 1.E-5)) { - if(fabs(det(dPhidxi)) > 0.) { - Lt = L + ((L*lambda)*(inv(dPhidxi))*(dPhidsigma*L)); - } - else - Lt = L; + try { + if(fabs(det(dPhidxi)) > 0.) { + Lt = L + ((L*lambda)*(inv(dPhidxi))*(dPhidsigma*L)); + } + else + Lt = L; + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv: throw inv exception " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside umat_sma_mono_cubic."); + } + ///Note : To use with Self-consistent micromechanics only! /* vec eigval = eig_sym(Lt); while(eigval(0) < 0.) { diff --git a/src/Simulation/Maths/num_solve.cpp b/src/Simulation/Maths/num_solve.cpp index f54e5b9eb..6ee5ce1eb 100755 --- a/src/Simulation/Maths/num_solve.cpp +++ b/src/Simulation/Maths/num_solve.cpp @@ -37,12 +37,17 @@ void Newton_Raphon(const vec &Phi, const vec &Y_crit, const mat &denom, vec &Dp, assert(fabs(Y_crit(i)) > 0.); } - if (fabs(det(denom)) > simcoon::limit) { - dp = -1.*solve(denom,Phi); - } - else { - dp = zeros(n); - } + try { + if (fabs(det(denom)) > simcoon::limit) { + dp = -1.*solve(denom,Phi); + } + else { + dp = zeros(n); + } + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv: throw inv exception " << e.what() << endl; + throw simcoon::exception_det("Error in det function inside Newton_Raphon."); + } //New update of the vector of the variable increment throughout the step Dp = Dp + dp; @@ -100,12 +105,17 @@ void Fischer_Burmeister(const vec &Phi, const vec &Y_crit, const mat &denom, vec } - if (fabs(det(denomFB)) > simcoon::limit) { - dp = -1.*solve(denomFB,FB); - } - else { - dp = zeros(n); - } + try { + if (fabs(det(denomFB)) > simcoon::limit) { + dp = -1.*solve(denomFB,FB); + } + else { + dp = zeros(n); + } + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv: throw inv exception " << e.what() << endl; + throw simcoon::exception_det("Error in det function inside Fischer_Burmeister."); + } //New update of the vector of the variable increment throughout the step Dp = Dp + dp; @@ -218,13 +228,18 @@ void Fischer_Burmeister_limits(const vec &Phi_p, const vec &Phi_l, const vec &Y_ } } - if (fabs(det(denomFB)) > simcoon::limit) { - dp = -1.*solve(denomFB,FB); - } - else { - dp = zeros(n); - } - + try { + if (fabs(det(denomFB)) > simcoon::limit) { + dp = -1.*solve(denomFB,FB); + } + else { + dp = zeros(n); + } + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv: throw inv exception " << e.what() << endl; + throw simcoon::exception_det("Error in det function inside Fischer_Burmeister_limits."); + } + //New update of the vector of the variable increment throughout the step Dp = Dp + dp; error = 0.; @@ -291,12 +306,17 @@ void Fischer_Burmeister_m(const vec &Phi, const vec &Y_crit, const mat &denom, v } - if (fabs(det(denomFB)) > simcoon::limit) { - dp = -1.*solve(denomFB, FB); - } - else { - dp = zeros(n); - } + try { + if (fabs(det(denomFB)) > simcoon::limit) { + dp = -1.*solve(denomFB, FB); + } + else { + dp = zeros(n); + } + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv: throw inv exception " << e.what() << endl; + throw simcoon::exception_det("Error in det function inside Fischer_Burmeister_m."); + } //New update of the transformation/orientation multipliers Dp = Dp + dp; @@ -421,12 +441,17 @@ void Fischer_Burmeister_m_limits(const vec &Phi_p, const vec &Phi_l, const vec & } } - if (fabs(det(denomFB)) > simcoon::limit) { - dp = -1.*solve(denomFB, FB); - } - else { - dp = zeros(n); - } + try { + if (fabs(det(denomFB)) > simcoon::limit) { + dp = -1.*solve(denomFB, FB); + } + else { + dp = zeros(n); + } + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv: throw inv exception " << e.what() << endl; + throw simcoon::exception_det("Error in det function inside Fischer_Burmeister_m_limits."); + } //New update of the transformation/orientation multipliers Dp = Dp + dp; diff --git a/test/Libraries/Continuum_mechanics/Thyperelastic.cpp b/test/Libraries/Continuum_mechanics/Thyperelastic.cpp index 6616a0da8..95c52a51e 100755 --- a/test/Libraries/Continuum_mechanics/Thyperelastic.cpp +++ b/test/Libraries/Continuum_mechanics/Thyperelastic.cpp @@ -51,7 +51,13 @@ TEST(Thyperelastic, isochoric_invariants) mat b_rand = simcoon::v2t_strain(randu(6))+eye(3,3); - double J = sqrt(det(b_rand)); + double J; + try { + J = sqrt(det(b_rand)); + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv: throw inv exception " << e.what() << endl; + throw simcoon::exception_det("Error in det function inside Thyperelastic."); + } mat b_bar = pow(J,-2./3.)*b_rand; vec I = zeros(3); @@ -96,7 +102,14 @@ TEST(Thyperelastic, isochoric_pstretch) mat V_rand = simcoon::v2t_strain(randu(6)) + eye(3,3); mat b_rand = powmat(V_rand,2); - double J = det(V_rand); + + double J; + try { + J = det(V_rand); + } catch (const std::runtime_error &e) { + cerr << "Error in det or inv: throw inv exception " << e.what() << endl; + throw simcoon::exception_det("Error in det function inside Thyperelastic."); + } vec lambda = eig_sym(V_rand); vec lambda_bar = pow(J,-1./3.)*lambda; From 1e4985e64144205f8c74dec224588bda11ae20fa Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Thu, 24 Apr 2025 08:34:27 +0200 Subject: [PATCH 18/46] add try catch inv --- .../Continuum_mechanics/objective_rates.cpp | 36 +++- .../Functions/constitutive.cpp | 7 +- .../Functions/derivatives.cpp | 2 +- .../Functions/kinematics.cpp | 63 +++++-- .../Functions/natural_basis.cpp | 21 ++- .../Functions/objective_rates.cpp | 159 ++++++++++++++---- .../Functions/recovery_props.cpp | 8 +- src/Continuum_mechanics/Functions/stress.cpp | 52 ++++-- .../Homogenization/ellipsoid_multi.cpp | 26 ++- .../Micromechanics/schemes.cpp | 124 +++++++++++--- .../Umat/Finite/Neo_hookean_comp.cpp | 8 +- .../Umat/Finite/Neo_hookean_incomp.cpp | 10 +- .../Umat/Finite/mooney_rivlin.cpp | 10 +- 13 files changed, 423 insertions(+), 103 deletions(-) diff --git a/simcoon-python-builder/src/python_wrappers/Libraries/Continuum_mechanics/objective_rates.cpp b/simcoon-python-builder/src/python_wrappers/Libraries/Continuum_mechanics/objective_rates.cpp index fbcc82916..69a63e5fe 100755 --- a/simcoon-python-builder/src/python_wrappers/Libraries/Continuum_mechanics/objective_rates.cpp +++ b/simcoon-python-builder/src/python_wrappers/Libraries/Continuum_mechanics/objective_rates.cpp @@ -10,6 +10,7 @@ #include #endif +#include #include #include #include @@ -113,7 +114,12 @@ py::tuple objective_rate(const std::string& corate_name, const py::array_t invS_ = mat_FTensor2(invS); diff --git a/src/Continuum_mechanics/Functions/kinematics.cpp b/src/Continuum_mechanics/Functions/kinematics.cpp index 3a638ad95..0e18823fa 100755 --- a/src/Continuum_mechanics/Functions/kinematics.cpp +++ b/src/Continuum_mechanics/Functions/kinematics.cpp @@ -72,7 +72,13 @@ mat G_UdX(const mat &F) { //This function computes the gradient of displacement (Eulerian) from the deformation gradient tensor mat G_Udx(const mat &F) { - return eye(3,3) - inv(F); + + try { + return eye(3,3) - inv(F); + } catch (const std::runtime_error &e) { + cerr << "Error in inv : " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside G_Udx."); + } } //This function computes the Right Cauchy-Green C @@ -89,14 +95,24 @@ mat L_Cauchy_Green(const mat &F) { void RU_decomposition(mat &R, mat &U, const mat &F) { mat U2 = F.t()*F; U = sqrtmat_sympd(U2); - R = F*inv(U); + try { + R = F*inv(U); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside RU_decomposition."); + } } //Provides the VR decomposition of the transformation gradient F void VR_decomposition(mat &V, mat &R, const mat &F) { mat V2 = F*F.t(); V = sqrtmat_sympd(V2); - R = inv(V)*F; + try { + R = inv(V)*F; + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside RU_decomposition."); + } } //This function computes the common Right (or Left) Cauchy-Green invariants @@ -105,13 +121,18 @@ vec Inv_X(const mat &X) { vec I = zeros(3); I(0) = trace(X); I(1) = 0.5*(pow(trace(X),2.) - trace(X*X)); - I(2) = det(X); +L_vol_hyper return I; } //This function computes the Cauchy deformation tensor b mat Cauchy(const mat &F) { - return inv(L_Cauchy_Green(F)); + try { + return inv(L_Cauchy_Green(F)); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Cauchy."); + } } //This function computes the Green-Lagrange finite strain tensor E @@ -133,15 +154,25 @@ mat Log_strain(const mat &F) { mat finite_L(const mat &F0, const mat &F1, const double &DTime) { //Definition of L = dot(F)*F^-1 - return (1./DTime)*(F1-F0)*inv(F1); + try { + return (1./DTime)*(F1-F0)*inv(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside finite_L."); + } } //This function computes the deformation rate D mat finite_D(const mat &F0, const mat &F1, const double &DTime) { //Definition of L = dot(F)*F^-1 - mat L = (1./DTime)*(F1-F0)*inv(F1); - + mat L; + try { + L = (1./DTime)*(F1-F0)*inv(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside finite_D."); + } //Definition of the deformation rate D return 0.5*(L+L.t()); @@ -151,7 +182,13 @@ mat finite_D(const mat &F0, const mat &F1, const double &DTime) { mat finite_W(const mat &F0, const mat &F1, const double &DTime) { //Definition of L = dot(F)*F^-1 - mat L = (1./DTime)*(F1-F0)*inv(F1); + mat L; + try { + L = (1./DTime)*(F1-F0)*inv(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside finite_W."); + } //Definition of the rotation matrix Q return 0.5*(L-L.t()); @@ -175,7 +212,13 @@ mat finite_Omega(const mat &F0, const mat &F1, const double &DTime) { //This function computes the increment of finite rotation mat finite_DQ(const mat &Omega0, const mat &Omega1, const double &DTime) { - return (eye(3,3)+0.5*DTime*Omega0)*(inv(eye(3,3)-0.5*DTime*Omega1)); + try { + return (eye(3,3)+0.5*DTime*Omega0)*(inv(eye(3,3)-0.5*DTime*Omega1)); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside finite_DQ."); + } + } diff --git a/src/Continuum_mechanics/Functions/natural_basis.cpp b/src/Continuum_mechanics/Functions/natural_basis.cpp index 314d06b93..4aab688dd 100755 --- a/src/Continuum_mechanics/Functions/natural_basis.cpp +++ b/src/Continuum_mechanics/Functions/natural_basis.cpp @@ -70,7 +70,12 @@ natural_basis::natural_basis(const std::vector &mg_i) } } - g0ij = inv(g_ij); + try { + g0ij = inv(g_ij); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside natural_basis constructor."); + } for (unsigned int i=0; i < 3; i++) { for (unsigned int j=0; j<3; j++) { @@ -130,7 +135,12 @@ void natural_basis::update(const std::vector &mg_i) } } - g0ij = inv(g_ij); + try { + g0ij = inv(g_ij); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside natural_basis update."); + } for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { @@ -158,7 +168,12 @@ void natural_basis::from_F(const arma::mat &F) } } - g0ij = inv(g_ij); + try { + g0ij = inv(g_ij); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside natural_basis from_F."); + } for (unsigned int i=0; i<3; i++) { for (unsigned int j=0; j<3; j++) { diff --git a/src/Continuum_mechanics/Functions/objective_rates.cpp b/src/Continuum_mechanics/Functions/objective_rates.cpp index 3d4e7f051..526a9906c 100755 --- a/src/Continuum_mechanics/Functions/objective_rates.cpp +++ b/src/Continuum_mechanics/Functions/objective_rates.cpp @@ -40,14 +40,28 @@ namespace simcoon{ void Jaumann(mat &DR, mat &D, mat &W, const double &DTime, const mat &F0, const mat &F1) { mat I = eye(3,3); - mat L = (1./DTime)*(F1-F0)*inv(F1); + mat L; + if(DTime > simcoon::iota) { + try { + L = (1./DTime)*(F1-F0)*inv(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Jaumann (L)."); + } + } + //decomposition of L D = 0.5*(L+L.t()); W = 0.5*(L-L.t()); //Jaumann - DR = (inv(I-0.5*DTime*W))*(I+0.5*DTime*W); + try { + DR = (inv(I-0.5*DTime*W))*(I+0.5*DTime*W); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Jaumann (DR)."); + } } void Green_Naghdi(mat &DR, mat &D, mat &Omega, const double &DTime, const mat &F0, const mat &F1) { @@ -60,14 +74,28 @@ void Green_Naghdi(mat &DR, mat &D, mat &Omega, const double &DTime, const mat &F RU_decomposition(R0,U0,F0); RU_decomposition(R1,U1,F1); - mat L = (1./DTime)*(F1-F0)*inv(F1); + mat L; + if(DTime > simcoon::iota) { + try { + L = (1./DTime)*(F1-F0)*inv(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Green_Naghdi (L)."); + } + } //decomposition of L D = 0.5*(L+L.t()); mat W = 0.5*(L-L.t()); Omega = (1./DTime)*(R1-R0)*R1.t(); - DR = (inv(I-0.5*DTime*Omega))*(I+0.5*DTime*Omega); + + try { + DR = (inv(I-0.5*DTime*Omega))*(I+0.5*DTime*Omega); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Green_Naghdi (DR)."); + } //alternative ... to test // DR = (F1-F0)*inv(U1)-R0*(U1-U0)*inv(U1); } @@ -82,14 +110,27 @@ void logarithmic_R(mat &DR, mat &N_1, mat &N_2, mat &D, mat &Omega, const double RU_decomposition(R0,U0,F0); RU_decomposition(R1,U1,F1); - mat L = (1./DTime)*(F1-F0)*inv(F1); + mat L; + if(DTime > simcoon::iota) { + try { + L = (1./DTime)*(F1-F0)*inv(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside logarithmic_R (L)."); + } + } //decomposition of L D = 0.5*(L+L.t()); mat W = 0.5*(L-L.t()); Omega = (1./DTime)*(R1-R0)*R1.t(); - DR = (inv(I-0.5*DTime*Omega))*(I+0.5*DTime*Omega); + try { + DR = (inv(I-0.5*DTime*Omega))*(I+0.5*DTime*Omega); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside logarithmic_R (DR)."); + } //alternative ... to test // DR = (F1-F0)*inv(U1)-R0*(U1-U0)*inv(U1); @@ -137,13 +178,19 @@ void logarithmic_F(mat &DF, mat &N_1, mat &N_2, mat &D, mat &L, const double &DT RU_decomposition(R0,U0,F0); RU_decomposition(R1,U1,F1); - L = (1./DTime)*(F1-F0)*inv(F1); + mat L; + if(DTime > simcoon::iota) { + try { + L = (1./DTime)*(F1-F0)*inv(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside logarithmic_F (L)."); + } + } //decomposition of L D = 0.5*(L+L.t()); mat W = 0.5*(L-L.t()); - - //alternative ... to test //Logarithmic mat B = L_Cauchy_Green(F1); @@ -177,18 +224,36 @@ void logarithmic_F(mat &DF, mat &N_1, mat &N_2, mat &D, mat &L, const double &DT } } - DF = (inv(I-0.5*DTime*L))*(I+0.5*DTime*L); - + try { + DF = (inv(I-0.5*DTime*L))*(I+0.5*DTime*L); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside logarithmic_F (DF)."); + } } void Truesdell(mat &DF, mat &D, mat &L, const double &DTime, const mat &F0, const mat &F1) { mat I = eye(3,3); - L = (1./DTime)*(F1-F0)*inv(F1); + mat L; + if(DTime > simcoon::iota) { + try { + L = (1./DTime)*(F1-F0)*inv(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Truesdell (L)."); + } + } + //Note that The "spin" is actually L (spin for rigid frames of reference, "flot" for Truesdell) D = 0.5*(L+L.t()); //Truesdell - DF = (inv(I-0.5*DTime*L))*(I+0.5*DTime*L); + try { + DF = (inv(I-0.5*DTime*L))*(I+0.5*DTime*L); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Truesdell (DF)."); + } } mat get_BBBB(const mat &F1) { @@ -240,10 +305,15 @@ mat get_BBBB_GN(const mat &F1) { void logarithmic(mat &DR, mat &D, mat &Omega, const double &DTime, const mat &F0, const mat &F1) { mat I = eye(3,3); mat L = zeros(3,3); - - if(DTime > simcoon::iota) { - L = (1./DTime)*(F1-F0)*inv(F1); - } + + if(DTime > simcoon::iota) { + try { + L = (1./DTime)*(F1-F0)*inv(F1); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside logarithmic (L)."); + } + } //decomposition of L D = 0.5*(L+L.t()); @@ -272,19 +342,37 @@ void logarithmic(mat &DR, mat &D, mat &Omega, const double &DTime, const mat &F0 } } Omega = W + N; - DR = (inv(I-0.5*DTime*Omega))*(I+0.5*DTime*Omega); + + try { + DR = (inv(I-0.5*DTime*Omega))*(I+0.5*DTime*Omega); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside logarithmic (DR)."); + } } mat Delta_log_strain(const mat &D, const mat &Omega, const double &DTime) { mat I = eye(3,3); - mat DR = (inv(I-0.5*DTime*Omega))*(I+0.5*DTime*Omega); + mat DR; + try { + DR = (inv(I-0.5*DTime*Omega))*(I+0.5*DTime*Omega); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside logarithmic (DR)."); + } return 0.5*(D+(DR*D*DR.t()))*DTime; } //This function computes the tangent modulus that links the Piola-Kirchoff II stress S to the Green-Lagrange stress E to the tangent modulus that links the Kirchoff elastic tensor and logarithmic strain, through the log rate and the and the transformation gradient F mat DtauDe_2_DSDE(const mat &Lt, const mat &B, const mat &F, const mat &tau){ - mat invF = inv(F); + mat invF; + try { + invF = inv(F); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside DtauDe_2_DSDE."); + } Tensor2 invF_ = mat_FTensor2(invF); Tensor2 delta_ = mat_FTensor2(eye(3,3)); Tensor2 tau_ = mat_FTensor2(tau); @@ -313,7 +401,14 @@ mat DtauDe_2_DSDE(const mat &Lt, const mat &B, const mat &F, const mat &tau){ mat Dtau_LieDD_2_DSDE(const mat &Lt, const mat &F){ - mat invF = inv(F); + mat invF; + try { + invF = inv(F); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Dtau_LieDD_2_DSDE."); + } + Tensor2 invF_ = mat_FTensor2(invF); Tensor4 Dtau_LieDD_ = mat_FTensor4(Lt); Tensor4 DSDE_ = mat_FTensor4(zeros(6,6)); @@ -334,7 +429,13 @@ mat Dtau_LieDD_2_DSDE(const mat &Lt, const mat &F){ mat DtauDe_JaumannDD_2_DSDE(const mat &Lt, const mat &F, const mat &tau){ - mat invF = inv(F); + mat invF; + try { + invF = inv(F); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside DtauDe_JaumannDD_2_DSDE."); + } Tensor2 invF_ = mat_FTensor2(invF); Tensor2 delta_ = mat_FTensor2(eye(3,3)); Tensor2 tau_ = mat_FTensor2(tau); @@ -367,7 +468,7 @@ mat DsigmaDe_2_DSDE(const mat &Lt, const mat &B, const mat &F, const mat &sigma) J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside DsigmaDe_2_DSDE."); + throw simcoon::exception_det("Error in det function inside DsigmaDe_2_DSDE."); } return J*DtauDe_2_DSDE(Lt, B, F, Cauchy2Kirchoff(sigma, F, J)); } @@ -380,7 +481,7 @@ mat DsigmaDe_2_DSDE(const mat &Lt, const mat &F, const mat &sigma){ J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside DsigmaDe_2_DSDE."); + throw simcoon::exception_det("Error in det function inside DsigmaDe_2_DSDE."); } mat B = get_BBBB(F); return J*DtauDe_2_DSDE(Lt, B, F, Cauchy2Kirchoff(sigma, F, J)); @@ -393,7 +494,7 @@ mat Dsigma_LieDD_2_DSDE(const mat &Lt, const mat &F){ J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside Dsigma_LieDD_2_DSDE."); + throw simcoon::exception_det("Error in det function inside Dsigma_LieDD_2_DSDE."); } return J*Dtau_LieDD_2_DSDE(Lt, F); } @@ -405,7 +506,7 @@ mat DsigmaDe_JaumannDD_2_DSDE(const mat &Lt, const mat &F, const mat &sigma){ J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside DsigmaDe_JaumannDD_2_DSDE."); + throw simcoon::exception_det("Error in det function inside DsigmaDe_JaumannDD_2_DSDE."); } return J*DtauDe_JaumannDD_2_DSDE(Lt, F, Cauchy2Kirchoff(sigma, F, J)); } @@ -456,7 +557,7 @@ mat DSDE_2_DsigmaDe(const mat &DSDE, const mat &B, const mat &F, const mat &sigm J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside DSDE_2_DsigmaDe."); + throw simcoon::exception_det("Error in det function inside DSDE_2_DsigmaDe."); } return (1./J)*DSDE_2_DtauDe(DSDE, B, F, Cauchy2Kirchoff(sigma, F, J)); } @@ -489,7 +590,7 @@ mat DSDE_2_DsigmaDe_LieDD(const mat &DSDE, const mat &F) { J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside DSDE_2_DsigmaDe_LieDD."); + throw simcoon::exception_det("Error in det function inside DSDE_2_DsigmaDe_LieDD."); } return (1./J)*DSDE_2_Dtau_LieDD(DSDE, F); } @@ -524,7 +625,7 @@ mat DSDE_2_Dsigma_JaumannDD(const mat &DSDE, const mat &F, const mat &sigma) { J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside DSDE_2_Dsigma_JaumannDD."); + throw simcoon::exception_det("Error in det function inside DSDE_2_Dsigma_JaumannDD."); } return (1./J)*DSDE_2_Dtau_JaumannDD(DSDE, F, Cauchy2Kirchoff(sigma, F, J)); } diff --git a/src/Continuum_mechanics/Functions/recovery_props.cpp b/src/Continuum_mechanics/Functions/recovery_props.cpp index 996d46cf3..c20bc8e30 100755 --- a/src/Continuum_mechanics/Functions/recovery_props.cpp +++ b/src/Continuum_mechanics/Functions/recovery_props.cpp @@ -366,7 +366,13 @@ vec M_cubic_props(const mat &Mt) { vec L_ortho_props(const mat &Lt) { - mat Mt = inv(Lt); + mat Mt; + try { + Mt = inv(Lt); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside L_ortho_props."); + } double E1 = 1/Mt(0,0); double E2 = 1/Mt(1,1); diff --git a/src/Continuum_mechanics/Functions/stress.cpp b/src/Continuum_mechanics/Functions/stress.cpp index 2af3b68fe..af62ec1d6 100755 --- a/src/Continuum_mechanics/Functions/stress.cpp +++ b/src/Continuum_mechanics/Functions/stress.cpp @@ -38,7 +38,7 @@ mat Cauchy2PKI(const mat &sigma, const mat &F, const double &mJ) { J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside Cauchy2PKI."); + throw simcoon::exception_det("Error in det function inside Cauchy2PKI."); } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 @@ -46,7 +46,12 @@ mat Cauchy2PKI(const mat &sigma, const mat &F, const double &mJ) { return zeros(3,3); } else { - return J*sigma*inv(F.t()); + try { + return J*sigma*inv(F.t()); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Cauchy2PKI."); + } } } @@ -72,7 +77,7 @@ mat Cauchy2PKII(const mat &sigma, const mat &F, const double &mJ) { J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside Cauchy2PKII."); + throw simcoon::exception_det("Error in det function inside Cauchy2PKII."); } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 @@ -80,7 +85,12 @@ mat Cauchy2PKII(const mat &sigma, const mat &F, const double &mJ) { return zeros(3,3); } else { - return J*inv(F)*sigma*inv(F.t()); + try { + return J*inv(F)*sigma*inv(F.t()); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Cauchy2PKII."); + } } } @@ -93,7 +103,7 @@ mat Cauchy2Kirchoff(const mat &sigma, const mat &F, const double &mJ) { J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside Cauchy2Kirchoff."); + throw simcoon::exception_det("Error in det function inside Cauchy2Kirchoff."); } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 @@ -115,7 +125,7 @@ vec Cauchy2Kirchoff(const vec &sigma, const mat &F, const double &mJ) { J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside Cauchy2Kirchoff."); + throw simcoon::exception_det("Error in det function inside Cauchy2Kirchoff."); } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 @@ -137,7 +147,7 @@ mat Kirchoff2Cauchy(const mat &tau, const mat &F, const double &mJ) { J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside Kirchoff2Cauchy."); + throw simcoon::exception_det("Error in det function inside Kirchoff2Cauchy."); } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 @@ -158,7 +168,7 @@ vec Kirchoff2Cauchy(const vec& tau, const mat& F, const double& mJ) { J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside Kirchoff2Cauchy."); + throw simcoon::exception_det("Error in det function inside Kirchoff2Cauchy."); } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 @@ -175,20 +185,36 @@ vec Kirchoff2Cauchy(const vec& tau, const mat& F, const double& mJ) { mat Kirchoff2PKI(const mat &tau, const mat &F, const double &mJ) { UNUSED(mJ); - return tau*inv(F.t()); + try { + return tau*inv(F.t()); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Kirchoff2PKI."); + } } //This function returns the second Piola-Kirchoff stress tensor from the Kirchoff stress tensor, the transformation gradient F and its determinant (optional, if not indicated, it will be computed) mat Kirchoff2PKII(const mat &tau, const mat &F, const double &mJ) { UNUSED(mJ); - return inv(F)*tau*inv(F.t()); + try { + return inv(F)*tau*inv(F.t()); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Kirchoff2PKII."); + } + } vec Kirchoff2PKII(const vec &tau, const mat &F, const double &mJ) { UNUSED(mJ); - return t2v_stress(inv(F)*v2t_stress(tau)*inv(F.t())); + try { + return t2v_stress(inv(F)*v2t_stress(tau)*inv(F.t())); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Kirchoff2PKII."); + } } @@ -215,7 +241,7 @@ mat PKI2Cauchy(const mat &Sigma, const mat &F, const double &mJ) { J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside PKI2Cauchy."); + throw simcoon::exception_det("Error in det function inside PKI2Cauchy."); } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 @@ -236,7 +262,7 @@ mat PKII2Cauchy(const mat &S, const mat &F, const double &mJ) { J = det(F); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside PKII2Cauchy."); + throw simcoon::exception_det("Error in det function inside PKII2Cauchy."); } } //If J is still less than a small value, we assume that sigma=tau=PK1=PKII = 0 diff --git a/src/Continuum_mechanics/Homogenization/ellipsoid_multi.cpp b/src/Continuum_mechanics/Homogenization/ellipsoid_multi.cpp index 56581ee89..39e315a23 100755 --- a/src/Continuum_mechanics/Homogenization/ellipsoid_multi.cpp +++ b/src/Continuum_mechanics/Homogenization/ellipsoid_multi.cpp @@ -133,8 +133,12 @@ void ellipsoid_multi::fillT(const mat& Lt_m, const mat& Lt, const ellipsoid &ell S_loc = Eshelby(Lt_m_local_geom, ell.a1, ell.a2, ell.a3, x, wx, y, wy, mp, np); mat Lt_local_geom = rotate_g2l_L(Lt, ell.psi_geom, ell.theta_geom, ell.phi_geom); - T_loc = inv(eye(6,6) + S_loc*inv(Lt_m_local_geom)*(Lt_local_geom - Lt_m_local_geom)); - + try { + T_loc = inv(eye(6,6) + S_loc*inv(Lt_m_local_geom)*(Lt_local_geom - Lt_m_local_geom)); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside ellipsoid_multi::fillT."); + } T = rotate_l2g_A(T_loc, ell.psi_geom, ell.theta_geom, ell.phi_geom); } @@ -147,7 +151,12 @@ void ellipsoid_multi::fillT_iso(const mat& Lt_m, const mat& Lt, const ellipsoid S_loc = Eshelby(Lt_m_iso, ell.a1, ell.a2, ell.a3, x, wx, y, wy, mp, np); mat Lt_local_geom = rotate_g2l_L(Lt, ell.psi_geom, ell.theta_geom, ell.phi_geom); - T_loc = inv(eye(6,6) + S_loc*inv(Lt_m_iso)*(Lt_local_geom - Lt_m_iso)); + try { + T_loc = inv(eye(6,6) + S_loc*inv(Lt_m_iso)*(Lt_local_geom - Lt_m_iso)); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside ellipsoid_multi::fillT_is."); + } T = rotate_l2g_A(T_loc, ell.psi_geom, ell.theta_geom, ell.phi_geom); } @@ -162,10 +171,15 @@ void ellipsoid_multi::fillT_mec_in(const mat& L_m, const mat& L, const ellipsoid S_loc = Eshelby(L_m_local_geom, ell.a1, ell.a2, ell.a3, x, wx, y, wy, mp, np); mat L_local_geom = rotate_g2l_L(L, ell.psi_geom, ell.theta_geom, ell.phi_geom); - T_loc = inv(eye(6,6) + S_loc*inv(L_m_local_geom)*(L_local_geom - L_m_local_geom)); + try { + T_loc = inv(eye(6,6) + S_loc*inv(L_m_local_geom)*(L_local_geom - L_m_local_geom)); + T_in_loc = (eye(6,6)-T_loc)*inv(L_m_local_geom - L_local_geom); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside ellipsoid_multi::fillT_mec_in."); + } + T = rotate_l2g_A(T_loc, ell.psi_geom, ell.theta_geom, ell.phi_geom); - - T_in_loc = (eye(6,6)-T_loc)*inv(L_m_local_geom - L_local_geom); T_in = rotate_l2g_M(T_in_loc, ell.psi_geom, ell.theta_geom, ell.phi_geom); } diff --git a/src/Continuum_mechanics/Micromechanics/schemes.cpp b/src/Continuum_mechanics/Micromechanics/schemes.cpp index d5ff449b7..a9ebad766 100755 --- a/src/Continuum_mechanics/Micromechanics/schemes.cpp +++ b/src/Continuum_mechanics/Micromechanics/schemes.cpp @@ -93,9 +93,14 @@ void Lt_Mori_Tanaka(phase_characteristics &phase, const int &n_matrix) { //Compute the normalization interaction tensir sumT sumT += elli->concentration*elli_multi->T; } - - inv_sumT = inv(sumT); - + + try { + inv_sumT = inv(sumT); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Lt_Mori_Tanaka."); + } + //Compute the strain concentration tensor A for(auto r : phase.sub_phases) { elli_multi = std::dynamic_pointer_cast(r.sptr_multi); @@ -131,8 +136,13 @@ void Lt_Mori_Tanaka_iso(phase_characteristics &phase, const int &n_matrix) { //Compute the normalization interaction tensir sumT sumT += elli->concentration*elli_multi->T; } - - inv_sumT = inv(sumT); + + try { + inv_sumT = inv(sumT); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Lt_Mori_Tanaka_iso."); + } //Compute the strain concentration tensor A for(auto r : phase.sub_phases) { @@ -169,7 +179,12 @@ void DE_Mori_Tanaka(phase_characteristics &phase, const int &n_matrix) { sumT += elli->concentration*elli_multi->T; } - inv_sumT = inv(sumT); + try { + inv_sumT = inv(sumT); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside DE_Mori_Tanaka."); + } //Compute the strain concentration tensor A for(auto r : phase.sub_phases) { @@ -209,7 +224,12 @@ void DE_Mori_Tanaka_iso(phase_characteristics &phase, const int &n_matrix) { sumT += elli->concentration*elli_multi->T; } - inv_sumT = inv(sumT); + try { + inv_sumT = inv(sumT); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside DE_Mori_Tanaka_iso."); + } //Compute the strain concentration tensor A for(auto r : phase.sub_phases) { @@ -382,20 +402,50 @@ void dE_Periodic_Layer(phase_characteristics &phase, const int &nbiter) { lay_multi->sigma_hat(1) = sigma_local(3); lay_multi->sigma_hat(2) = sigma_local(4); } - - for(auto r : phase.sub_phases) { - lay_multi = std::dynamic_pointer_cast(r.sptr_multi); - lay = std::dynamic_pointer_cast(r.sptr_shape); - sumDnn += lay->concentration*inv(lay_multi->Dnn); - sumcDsig += lay->concentration*inv(lay_multi->Dnn)*lay_multi->sigma_hat; - } - vec m = inv(sumDnn)*sumcDsig; - + + try { + for(auto r : phase.sub_phases) { + lay_multi = std::dynamic_pointer_cast(r.sptr_multi); + lay = std::dynamic_pointer_cast(r.sptr_shape); + sumDnn += lay->concentration*inv(lay_multi->Dnn); + sumcDsig += lay->concentration*inv(lay_multi->Dnn)*lay_multi->sigma_hat; + } + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside dE_Periodic_Layer."); + } + + vec m; + try { + m = inv(sumDnn)*sumcDsig; + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside dE_Periodic_Layer."); + } + + try { + for(auto r : phase.sub_phases) { + lay_multi = std::dynamic_pointer_cast(r.sptr_multi); + lay = std::dynamic_pointer_cast(r.sptr_shape); + sumDnn += lay->concentration*inv(lay_multi->Dnn); + sumcDsig += lay->concentration*inv(lay_multi->Dnn)*lay_multi->sigma_hat; + } + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside dE_Periodic_Layer."); + } + for(auto r : phase.sub_phases) { sv_r = std::dynamic_pointer_cast(r.sptr_sv_global); lay_multi = std::dynamic_pointer_cast(r.sptr_multi); - lay_multi->dzdx1 = inv(lay_multi->Dnn)*(m-lay_multi->sigma_hat); + + try { + lay_multi->dzdx1 = inv(lay_multi->Dnn)*(m-lay_multi->sigma_hat); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside dE_Periodic_Layer."); + } lay = std::dynamic_pointer_cast(r.sptr_shape); mat dEtot_local = zeros(6); @@ -449,20 +499,40 @@ void Lt_Periodic_Layer(phase_characteristics &phase) { mat sumDnn = zeros(3,3); mat sumDnt = zeros(3,3); - for(auto r : phase.sub_phases) { - lay_multi = std::dynamic_pointer_cast(r.sptr_multi); - lay = std::dynamic_pointer_cast(r.sptr_shape); - sumDnn += lay->concentration*inv(lay_multi->Dnn); - sumDnt += lay->concentration*inv(lay_multi->Dnn)*lay_multi->Dnt; - } - mat m_n = inv(sumDnn); + + try { + for(auto r : phase.sub_phases) { + lay_multi = std::dynamic_pointer_cast(r.sptr_multi); + lay = std::dynamic_pointer_cast(r.sptr_shape); + sumDnn += lay->concentration*inv(lay_multi->Dnn); + sumDnt += lay->concentration*inv(lay_multi->Dnn)*lay_multi->Dnt; + } + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Lt_Periodic_Layer."); + } + + mat m_n; + try { + m_n = inv(sumDnn); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Lt_Periodic_Layer."); + } + mat m_t = m_n*sumDnt; for(auto r : phase.sub_phases) { lay_multi = std::dynamic_pointer_cast(r.sptr_multi); - lay = std::dynamic_pointer_cast(r.sptr_shape); - lay_multi->dXn = inv(lay_multi->Dnn)*(m_n-lay_multi->Dnn); - lay_multi->dXt = inv(lay_multi->Dnn)*(m_t-lay_multi->Dnt); + lay = std::dynamic_pointer_cast(r.sptr_shape); + + try { + lay_multi->dXn = inv(lay_multi->Dnn)*(m_n-lay_multi->Dnn); + lay_multi->dXt = inv(lay_multi->Dnn)*(m_t-lay_multi->Dnt); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside Lt_Periodic_Layer."); + } A_loc = eye(6,6); diff --git a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp index 249321c0f..f9bea1783 100755 --- a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp +++ b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp @@ -94,7 +94,13 @@ void umat_neo_hookean_comp(const vec &Etot, const vec &DEtot, const mat &F0, con double W = mu/2.0*(I1-3.) - mu*log(J) + lambda/2.0*pow(log(J),2.); - mat invC = inv(C); + mat invC; + try { + invC = inv(C); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside umat_neo_hookean_comp."); + } mat I = eye(3,3); //Compute the PKII stress and then the Cauchy stress diff --git a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp index b2cc24dce..7943917e3 100755 --- a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp +++ b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp @@ -88,13 +88,19 @@ void umat_neo_hookean_incomp(const vec &etot, const vec &Detot, const mat &F0, c J = det(F1); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside umat_neo_hookean_incomp."); + throw simcoon::exception_det("Error in det function inside umat_neo_hookean_incomp."); } double I1_bar = pow(J,-2./3.)*I1; double W = C_10*(I1_bar-3.) + (1./D_1)*pow(J-1.,2.); - mat invC = inv(C); + mat invC; + try { + invC = inv(C); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside umat_neo_hookean_incomp."); + } mat I = eye(3,3); //Compute the PKII stress and then the Cauchy stress diff --git a/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp b/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp index 102a667f1..2e220b300 100755 --- a/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp +++ b/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp @@ -88,13 +88,19 @@ void umat_mooney_rivlin(const vec &Etot, const vec &DEtot, const mat &F0, const J = det(F1); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside umat_mooney_rivlin."); + throw simcoon::exception_det("Error in det function inside umat_mooney_rivlin."); } double I1_bar = pow(J,-2./3.)*I1; double W = C_10*(I1_bar-3.) + (1./D_1)*pow(J-1.,2.); - mat invC = inv(C); + mat invC; + try { + invC = inv(C); + } catch (const std::runtime_error &e) { + cerr << "Error in inv: " << e.what() << endl; + throw simcoon::exception_inv("Error in inv function inside umat_mooney_rivlin."); + } mat I = eye(3,3); //Compute the PKII stress and then the Cauchy stress From 6eaf8a4db8fca5a82e6cbac2701ac31b76e52388 Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Thu, 24 Apr 2025 08:36:43 +0200 Subject: [PATCH 19/46] include exception.hpp --- src/Continuum_mechanics/Functions/constitutive.cpp | 1 + src/Continuum_mechanics/Functions/derivatives.cpp | 1 + src/Continuum_mechanics/Functions/kinematics.cpp | 1 + src/Continuum_mechanics/Functions/natural_basis.cpp | 1 + src/Continuum_mechanics/Functions/recovery_props.cpp | 1 + src/Continuum_mechanics/Functions/stress.cpp | 1 + src/Continuum_mechanics/Homogenization/ellipsoid_multi.cpp | 1 + src/Continuum_mechanics/Micromechanics/schemes.cpp | 1 + src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp | 1 + src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp | 1 + .../Umat/Finite/generic_hyper_invariants.cpp | 3 ++- src/Continuum_mechanics/Umat/Finite/generic_hyper_pstretch.cpp | 3 ++- src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp | 1 + src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp | 2 +- src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp | 1 + src/Simulation/Maths/num_solve.cpp | 1 + test/Libraries/Continuum_mechanics/Thyperelastic.cpp | 2 +- 17 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/Continuum_mechanics/Functions/constitutive.cpp b/src/Continuum_mechanics/Functions/constitutive.cpp index fa811c480..be3f73743 100755 --- a/src/Continuum_mechanics/Functions/constitutive.cpp +++ b/src/Continuum_mechanics/Functions/constitutive.cpp @@ -24,6 +24,7 @@ along with simcoon. If not, see . #include #include #include +#include #include using namespace std; diff --git a/src/Continuum_mechanics/Functions/derivatives.cpp b/src/Continuum_mechanics/Functions/derivatives.cpp index cea35f9ee..465646a3d 100755 --- a/src/Continuum_mechanics/Functions/derivatives.cpp +++ b/src/Continuum_mechanics/Functions/derivatives.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include diff --git a/src/Continuum_mechanics/Functions/kinematics.cpp b/src/Continuum_mechanics/Functions/kinematics.cpp index 0e18823fa..3e119edf3 100755 --- a/src/Continuum_mechanics/Functions/kinematics.cpp +++ b/src/Continuum_mechanics/Functions/kinematics.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include using namespace std; diff --git a/src/Continuum_mechanics/Functions/natural_basis.cpp b/src/Continuum_mechanics/Functions/natural_basis.cpp index 4aab688dd..7b303b43a 100755 --- a/src/Continuum_mechanics/Functions/natural_basis.cpp +++ b/src/Continuum_mechanics/Functions/natural_basis.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include using namespace std; diff --git a/src/Continuum_mechanics/Functions/recovery_props.cpp b/src/Continuum_mechanics/Functions/recovery_props.cpp index c20bc8e30..c77041af4 100755 --- a/src/Continuum_mechanics/Functions/recovery_props.cpp +++ b/src/Continuum_mechanics/Functions/recovery_props.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include diff --git a/src/Continuum_mechanics/Functions/stress.cpp b/src/Continuum_mechanics/Functions/stress.cpp index af62ec1d6..9733de0c6 100755 --- a/src/Continuum_mechanics/Functions/stress.cpp +++ b/src/Continuum_mechanics/Functions/stress.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include diff --git a/src/Continuum_mechanics/Homogenization/ellipsoid_multi.cpp b/src/Continuum_mechanics/Homogenization/ellipsoid_multi.cpp index 39e315a23..d8d2fdc3f 100755 --- a/src/Continuum_mechanics/Homogenization/ellipsoid_multi.cpp +++ b/src/Continuum_mechanics/Homogenization/ellipsoid_multi.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include diff --git a/src/Continuum_mechanics/Micromechanics/schemes.cpp b/src/Continuum_mechanics/Micromechanics/schemes.cpp index a9ebad766..e91c7c86d 100755 --- a/src/Continuum_mechanics/Micromechanics/schemes.cpp +++ b/src/Continuum_mechanics/Micromechanics/schemes.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include diff --git a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp index f9bea1783..6b8a78f1a 100755 --- a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp +++ b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_comp.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include diff --git a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp index 7943917e3..26105dc73 100755 --- a/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp +++ b/src/Continuum_mechanics/Umat/Finite/Neo_hookean_incomp.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include diff --git a/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp b/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp index 702013c78..33e8449a3 100755 --- a/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp +++ b/src/Continuum_mechanics/Umat/Finite/generic_hyper_invariants.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -78,7 +79,7 @@ void umat_generic_hyper_invariants(const std::string &umat_name, const vec &etot J = det(F1); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside umat_generic_hyper_invariants."); + throw simcoon::exception_det("Error in det function inside umat_generic_hyper_invariants."); } vec I_bar = isochoric_invariants(b, J); diff --git a/src/Continuum_mechanics/Umat/Finite/generic_hyper_pstretch.cpp b/src/Continuum_mechanics/Umat/Finite/generic_hyper_pstretch.cpp index 9aa3748d3..9e2c77885 100755 --- a/src/Continuum_mechanics/Umat/Finite/generic_hyper_pstretch.cpp +++ b/src/Continuum_mechanics/Umat/Finite/generic_hyper_pstretch.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -71,7 +72,7 @@ void umat_generic_hyper_pstretch(const std::string &umat_name, const vec &etot, J = det(F1); } catch (const std::runtime_error &e) { cerr << "Error in det: " << e.what() << endl; - throw simcoon::exception_det("Error in eig_sym function inside umat_generic_hyper_pstretch."); + throw simcoon::exception_det("Error in det function inside umat_generic_hyper_pstretch."); } vec dWdlambda_bar = zeros(3); diff --git a/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp b/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp index 2e220b300..d3a907727 100755 --- a/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp +++ b/src/Continuum_mechanics/Umat/Finite/mooney_rivlin.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include diff --git a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp index 114734e24..7b0244a4b 100644 --- a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono.cpp @@ -22,7 +22,7 @@ #include #include #include - +#include #include #include #include diff --git a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp index 13a54b4b7..982055e6d 100644 --- a/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp +++ b/src/Continuum_mechanics/Umat/Mechanical/SMA/SMA_mono_cubic.cpp @@ -24,6 +24,7 @@ #include #include +#include #include #include #include diff --git a/src/Simulation/Maths/num_solve.cpp b/src/Simulation/Maths/num_solve.cpp index 6ee5ce1eb..25a8b92d9 100755 --- a/src/Simulation/Maths/num_solve.cpp +++ b/src/Simulation/Maths/num_solve.cpp @@ -19,6 +19,7 @@ #include #include #include +#include using namespace std; using namespace arma; diff --git a/test/Libraries/Continuum_mechanics/Thyperelastic.cpp b/test/Libraries/Continuum_mechanics/Thyperelastic.cpp index 95c52a51e..c76e249cf 100755 --- a/test/Libraries/Continuum_mechanics/Thyperelastic.cpp +++ b/test/Libraries/Continuum_mechanics/Thyperelastic.cpp @@ -21,8 +21,8 @@ #include #include - #include +#include #include #include From d968af8d8668be84d850c8b4ff12a929e4e1e47f Mon Sep 17 00:00:00 2001 From: Yves Chemisky Date: Thu, 24 Apr 2025 08:38:08 +0200 Subject: [PATCH 20/46] Add test --- simcoon-python-builder/CMakeLists.txt | 41 ++++++++ .../test/exception_test/Teig_sym.cpp | 88 ++++++++++++++++++ .../test/exception_test/Teig_sym.hpp | 38 ++++++++ ...est_exception.cpython-313-pytest-8.3.5.pyc | Bin 0 -> 2285 bytes .../test/exception_test/bindings.cpp | 30 ++++++ .../test/exception_test/run_test_exception.py | 42 +++++++++ .../test/exception_test/test_exception.so | Bin 0 -> 183680 bytes 7 files changed, 239 insertions(+) create mode 100644 simcoon-python-builder/test/exception_test/Teig_sym.cpp create mode 100644 simcoon-python-builder/test/exception_test/Teig_sym.hpp create mode 100644 simcoon-python-builder/test/exception_test/__pycache__/run_test_exception.cpython-313-pytest-8.3.5.pyc create mode 100755 simcoon-python-builder/test/exception_test/bindings.cpp create mode 100644 simcoon-python-builder/test/exception_test/run_test_exception.py create mode 100755 simcoon-python-builder/test/exception_test/test_exception.so diff --git a/simcoon-python-builder/CMakeLists.txt b/simcoon-python-builder/CMakeLists.txt index 922876a53..7a01f8dfe 100755 --- a/simcoon-python-builder/CMakeLists.txt +++ b/simcoon-python-builder/CMakeLists.txt @@ -144,6 +144,7 @@ include_directories(include) #Command file to get all the files in the src/ and include/ file(GLOB_RECURSE source_files_simmit src/python_wrappers/* include/simcoon/python_wrappers/*) file(GLOB_RECURSE test_files_carma test/Carma/*.cpp test/Carma/*.hpp) +file(GLOB_RECURSE test_files_exception test/exception_test/*.cpp test/exception_test/*.hpp) ################################################################################ # SIMCOON PYBIND11 modules @@ -212,6 +213,46 @@ add_test(NAME test_carma_arr_to_mat WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/Carma/run_test_arr_to_mat.py) +if (MSVC) #if windows using visual c++ + + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/exception_test) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/exception_test) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/exception_test) + + # Specify the output directory for each configuration (Debug, Release, etc.) + foreach(CONFIG_TYPE ${CMAKE_CONFIGURATION_TYPES}) + string(TOUPPER ${CONFIG_TYPE} CONFIG) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONFIG} "${CMAKE_CURRENT_SOURCE_DIR}/test/exception_test") + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONFIG} "${CMAKE_CURRENT_SOURCE_DIR}/test/exception_test") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIG} "${CMAKE_CURRENT_SOURCE_DIR}/test/exception_test") + endforeach() +endif() + +set(LIBRARY_OUTPUT_PATH {CMAKE_CURRENT_SOURCE_DIR}/test) +pybind11_add_module(test_exception ${test_files_exception}) + +# Set output directories based on the build type +if(MSVC) + set_target_properties(test_exception PROPERTIES + PREFIX "" + SUFFIX ".pyd" + ) +else() + # For non-MSVC platforms + set_target_properties(test_exception PROPERTIES + PREFIX "" + SUFFIX ".so" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/test/exception_test" + ) +endif() +#Link libraries +target_link_libraries(test_exception PRIVATE carma::carma ${ARMADILLO_LIBRARIES} Python3::Module) + +#Finally add it to test execution - +#Notice the WORKING_DIRECTORY and COMMAND +add_test(NAME test_simcoon_exception WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/exception_test + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/exception_test/run_test_exception.py) + #Finally add it to test execution - #Notice the WORKING_DIRECTORY and COMMAND add_test(NAME simmit_test WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/simmit_test diff --git a/simcoon-python-builder/test/exception_test/Teig_sym.cpp b/simcoon-python-builder/test/exception_test/Teig_sym.cpp new file mode 100644 index 000000000..207cc4c73 --- /dev/null +++ b/simcoon-python-builder/test/exception_test/Teig_sym.cpp @@ -0,0 +1,88 @@ +/* This file is part of simcoon. + + simcoon is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + simcoon is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with simcoon. If not, see . + + */ + +///@file Teig_sym.cpp +///@brief Test for the exceptions raised with simcoon +///@version 1.0 + +#include +#include +#include +#include +#include +#include + +using namespace std; +namespace py = pybind11; +namespace testexception { + +py::array_t test_eig_sym_val_affect(const py::array_t &matrix_fail_eigen, const bool ©) { + + //Try eigen decomposition : fail since decomposition is not unique + arma::mat arma_fail_eigen = carma::arr_to_mat(matrix_fail_eigen); + + arma::vec eigval; + + try { + eigval = arma::eig_sym(arma_fail_eigen); + } catch (const std::runtime_error &e) { + cerr << "Error in eig_sym: " << e.what() << endl; + throw simcoon::exception_eig_sym("Error in eig_sym function inside test_eig_sym_val_affect."); + } +} + +py::array_t test_eig_sym_val_modify(const py::array_t &matrix_fail_eigen, const bool ©) { + + //Try eigen decomposition : fail since decomposition is not unique + arma::mat arma_fail_eigen = carma::arr_to_mat(matrix_fail_eigen); + arma::vec eigval; + + bool success = arma::eig_sym(eigval, arma_fail_eigen); + + if (success) { + eigval.print("Eigenvalues:"); + return carma::col_to_arr(eigval, copy); + } else { + cout << "Eigen decomposition failed." << endl; + throw simcoon::exception_eig_sym("Error in eig_sym function inside test_eig_sym_val_modify."); + } +} + +py::tuple test_eig_sym_val_vec(const py::array_t &matrix_fail_eigen, const bool ©) { + + //Try eigen decomposition : fail since decomposition is not unique + arma::mat arma_fail_eigen = carma::arr_to_mat(matrix_fail_eigen); + arma::vec eigval; + arma::mat eigvec; + + bool success = arma::eig_sym(eigval, eigvec, arma_fail_eigen); + + if (success) { + eigval.print("Eigenvalues:"); + eigvec.print("Eigenvectors:"); + return py::make_tuple(carma::col_to_arr(eigval, copy), carma::mat_to_arr(eigvec, copy)); + } else { + cout << "Eigen decomposition failed." << endl; + throw simcoon::exception_eig_sym("Error in eig_sym function inside test_eig_sym_val_vec."); + } +} + + + + + +} // namespace testexception diff --git a/simcoon-python-builder/test/exception_test/Teig_sym.hpp b/simcoon-python-builder/test/exception_test/Teig_sym.hpp new file mode 100644 index 000000000..c7d3c5d93 --- /dev/null +++ b/simcoon-python-builder/test/exception_test/Teig_sym.hpp @@ -0,0 +1,38 @@ +/* This file is part of simcoon. + + simcoon is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + simcoon is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with arma2numpy. If not, see . + + */ + +///@file Teig_sym.hpp +///@brief Test for the exceptions raised with simcoon +///@version 1.0 + +#pragma once +#include +#include +#include +#include + +namespace testexception { + +pybind11::array_t test_eig_sym_val_affect(const py::array_t &matrix_fail_eigen, const bool ©=true); + +pybind11::array_t test_eig_sym_val_modify(const py::array_t &matrix_fail_eigen, const bool ©=true); + +pybind11::tuple test_eig_sym_val_vec(const py::array_t &matrix_fail_eigen, const bool ©=true); + +//py::tuple test_eig_sym(py::array_t& arr, bool copy); + +} // namespace testexception \ No newline at end of file diff --git a/simcoon-python-builder/test/exception_test/__pycache__/run_test_exception.cpython-313-pytest-8.3.5.pyc b/simcoon-python-builder/test/exception_test/__pycache__/run_test_exception.cpython-313-pytest-8.3.5.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86b22ae5e30c997f36ac458c9c875ec714b0f5d3 GIT binary patch literal 2285 zcmcIlPi)gx82{`SJ5K6mOX>eYaH~ovf;Ix$X{{()llD@&3L1KX$?{w$_0~Avv%^St z7($cAkxQkG3)gYjChf#=Ejw^*;85+cUA9S6Z;`@b8i(zBPMmg72GTSu`QFdp|L=R> zdv0`g#sQzN{pi|B3E)@$5zY}1u36Nx%Z^s4IHr$ae2+U> zVo}fXxF9Vs$urBY#bj#v73!F+Ai*LdCHQa5A=!j00h5zuu?^c`1Txs3O9E0cpadzI z6q*VStiULwBTH#gY;x+K?r|@BJV2W4#W?25dwfIEgmPh%@V!fmOmti(1vO&UU09=D zFzj{RvWu3Zd)1Q1tu+aXYBoo zy}oMEjE|knSl3O<<(<-lS6XQTz0DtYtE}tY7lP9_F*vWmJAvc|{5CLjxBpK6FX~aI z_TaA`jl|*&A`i+tk=}X&)YMMoSOZnTY;}lZ;QJkP{3w>c38`21dTkmjz`B4 zXT>GAxfX;1%#hsIu-CTx0ljBsiu_#s*;ROu%c8L(BB|wrlv%HxMxOpfx>)tRDP(e<8U6 zb(u)#e@YJSCeJ)dp4mA&|Gob>xp+&iD@3{^yhM=w7s1fz?$Feup{bqe#fPhphw?S0 z|5oqq-anom1GQ(j<3z3FL<0njsdVlnrtY8KRc30+%(FT{-m|B1Q2V(ULv#7!Lt|ID zSW_+r@=HRXaKH;D!qsN(f3&O2)|A;mE&IA^e|qm>4{r9&j>4V3Y!bff%TB;nd>}Ur zTch3C1lf99&Bn-fOhUY!jAu`i?IAULifo^fIG*UvrN{$C%?*$T0}{u>-E$q}!K6AT zlOJRWak`sDb$zvL>N->S-R#?r$JBS+s@{GZ(DClZNgg*myz7Gx8?`>Bwr{amo5i9b zFOJ5+jvACn!MBp~%ZsT29`~!R?G%~ZT8ZQOEYX~Ra0clSt}i#;uxP=)jvq^lMVIDg z`9~Ky>t(}#Ya*DhU|{Y6O`=V6o|JPqmX&quJk21FU-;fdB)Efu@FPtA4)7T~hOVDs z@Cl4OfzG-NqVjp_X6m+G6STUh2&pe}cQ1T-;Vbdm_`P`T=-CD!uR%Z@4y29V9w93P G5&s4s^&Oo6 literal 0 HcmV?d00001 diff --git a/simcoon-python-builder/test/exception_test/bindings.cpp b/simcoon-python-builder/test/exception_test/bindings.cpp new file mode 100755 index 000000000..d09f6f3d5 --- /dev/null +++ b/simcoon-python-builder/test/exception_test/bindings.cpp @@ -0,0 +1,30 @@ +#include +// include numpy header for usage of array_t +#include + +#include +#include +#include +#include "Teig_sym.hpp" + +#include + +namespace py = pybind11; +using namespace testexception; + +using namespace pybind11::literals; + +PYBIND11_MODULE(test_exception, m) { + + // Register the exception translator +// py::register_exception(m, "CppRuntimeError"); + py::register_exception(m, "CppExceptionEigSym", PyExc_RuntimeError); + +// py::register_exception(m, "CppExceptionEigSym"); + + //Register the test_eig_sym_val_vec + m.def("test_eig_sym_val_modify", &test_eig_sym_val_modify, "matrix_fail_eigen"_a, "copy"_a=true, "This function is used to test the eig_sym exception (modify eigval)"); + m.def("test_eig_sym_val_affect", &test_eig_sym_val_affect, "matrix_fail_eigen"_a, "copy"_a=true, "This function is used to test the eig_sym exception (affectation)"); + m.def("test_eig_sym_val_vec", &test_eig_sym_val_vec, "matrix_fail_eigen"_a, "copy"_a=true, "This function is used to test the eig_sym exception (modify eigval and eigvec)"); + +} diff --git a/simcoon-python-builder/test/exception_test/run_test_exception.py b/simcoon-python-builder/test/exception_test/run_test_exception.py new file mode 100644 index 000000000..f9a6d3fb7 --- /dev/null +++ b/simcoon-python-builder/test/exception_test/run_test_exception.py @@ -0,0 +1,42 @@ +"""Test numpy array to matrix conversion function.""" + +import numpy as np +import numpy.typing as npt +import test_exception as exception +import pytest + + +@pytest.fixture(scope="session") +def Mat_fail_eigen_sym() -> npt.NDArray[np.float64]: + mat_fail_eigen_sym = np.array( + [ + [1.0e1222, 2, 3], + [9, 1, 4], # 9 ≠ 2 → asymmetric in lower triangle + [0, 0, 1], + ] + ) + return mat_fail_eigen_sym + + +def test_eig_sym(Mat_fail_eigen_sym): + """Test eigen_sym exception.""" + + try: + eigval = exception.test_eig_sym_val_affect(Mat_fail_eigen_sym, True) + except exception.CppExceptionEigSym as e: + print("Caught C++ exception in test_eig_sym_val:", e) + + try: + eigval = exception.test_eig_sym_val_affect(Mat_fail_eigen_sym, True) + except RuntimeError as e: + print("Caught C++ std::runtime_error exception in test_eig_sym_val:", e) + + try: + eigval = exception.test_eig_sym_val_modify(Mat_fail_eigen_sym, True) + except exception.CppExceptionEigSym as e: + print("Caught C++ exception in test_eig_sym_val_vec:", e) + + try: + (eigval, eigvec) = exception.test_eig_sym_val_vec(Mat_fail_eigen_sym, True) + except exception.CppExceptionEigSym as e: + print("Caught C++ exception in test_eig_sym_val_vec:", e) diff --git a/simcoon-python-builder/test/exception_test/test_exception.so b/simcoon-python-builder/test/exception_test/test_exception.so new file mode 100755 index 0000000000000000000000000000000000000000..3cc27bff201df200edcb9f697aba3c47e86a2611 GIT binary patch literal 183680 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