39 #include <ginac/ginac.h>
45 template <
class T,
class Tder>
51 std::vector<GiNaC::symbol *>
gEps;
60 std::vector<std::string>& epsilon,
61 std::vector<std::string>& expression);
64 virtual std::ostream&
Restart(std::ostream& out)
const;
65 virtual void Update(
const T& Eps,
const T& = 0.);
75 template <
class T,
class Tder>
79 std::vector<std::string>& epsilon,
80 std::vector<std::string>& expression)
83 if (
typeid(T) ==
typeid(
Vec3)) {
86 }
else if (
typeid(T) ==
typeid(
Vec6)) {
97 for (
unsigned row = 0; row <
dim; row++) {
105 for (
unsigned row = 0; row <
dim; row++) {
106 gEps[row] =
new GiNaC::symbol(epsilon[row]);
107 l.append(*
gEps[row]);
110 for (
unsigned row = 0; row <
dim; row++) {
112 gExpr[row] = GiNaC::ex(expression[row], l);
114 }
catch (std::exception& e) {
115 silent_cerr(
"GiNaCElasticConstitutiveLaw<T, Tder>: expression #" << row <<
" parsing "
116 "failed: " << e.what() << std::endl);
120 for (
unsigned col = 0; col <
dim; col++) {
124 }
catch (std::exception& e) {
125 silent_cerr(
"GiNaCElasticConstitutiveLaw<T, Tder>: expression #" << row <<
" differentiation "
126 "wrt/ Eps #" << col <<
"failed: "
127 << e.what() << std::endl);
133 silent_cout(
"\tGiNaCElasticConstitutiveLaw:" << std::endl);
134 for (
unsigned row = 0; row <
dim; row++) {
135 silent_cout(
"\t\tEps[" << row <<
"]: \"" << *
gEps[row] <<
"\"" << std::endl);
137 for (
unsigned row = 0; row <
dim; row++) {
138 silent_cout(
"\t\tConstitutive law[" << row <<
"]: \"" <<
gExpr[row] <<
"\"" << std::endl);
140 for (
unsigned row = 0; row <
dim; row++) {
141 for (
unsigned col = 0; col <
dim; col++) {
142 silent_cout(
"\t\tDer[" << row <<
"]/Eps[" << row <<
"][" << col <<
"]: \"" <<
gExprDEps[row][col] <<
"\"" << std::endl);
150 catch (std::exception& e) {
151 silent_cerr(
"GiNaCElasticConstitutiveLaw<T, Tder>::GiNaCElasticConstitutiveLaw: Update() failed (" << e.what() <<
")" << std::endl);
156 template <
class T,
class Tder>
159 for (
unsigned row = 0; row < dim; row++) {
169 std::vector<std::string> epsilon(dim);
170 std::vector<std::string> expression(dim);
172 for (
unsigned row = 0; row < dim; row++) {
173 std::ostringstream eps;
174 std::ostringstream expr;
179 epsilon[row] = eps.str();
180 expression[row] = expr.str();
188 epsilon, expression));
193 template <
class T,
class Tder> std::ostream&
196 out <<
"symbolic elastic, epsilon";
197 for (
unsigned row = 0; row < dim; row++) {
198 out <<
", \"" << *gEps[row] <<
"\"";
200 out <<
"\", expression";
201 for (
unsigned row = 0; row < dim; row++) {
202 out <<
", \"" << gExpr[row] <<
"\"";
208 template <
class T,
class Tder>
void
218 for (
unsigned row = 0; row < dim; row++) {
219 l.append(*gEps[row] == e(row + 1));
224 for (
unsigned row = 0; row < dim; row++) {
225 GiNaC::ex f_expr = gExpr[row].subs(l);
228 += GiNaC::ex_to<GiNaC::numeric>(f_expr).to_double();
230 for (
unsigned col = 0; col < dim; col++) {
231 GiNaC::ex f_derEps = gExprDEps[row][col].subs(l);
234 = GiNaC::ex_to<GiNaC::numeric>(f_derEps).to_double();
254 std::vector<std::string>& epsilon,
255 std::vector<std::string>& expression);
258 virtual std::ostream&
Restart(std::ostream& out)
const;
265 std::vector<std::string>& epsilon,
266 std::vector<std::string>& expression)
277 gExpr = GiNaC::ex(expression[0], l);
279 }
catch (std::exception& e) {
280 silent_cerr(
"GiNaCElasticConstitutiveLaw<doublereal, doublereal>: expression parsing failed: " << e.what() << std::endl);
287 }
catch (std::exception& e) {
288 silent_cerr(
"GiNaCElasticConstitutiveLaw<doublereal, doublereal>: expression differentiation wrt/ Eps failed: " << e.what() << std::endl);
292 silent_cout(
"\tGiNaCElasticConstitutiveLaw:" << std::endl
293 <<
"\t\tEps: \"" <<
gEps <<
"\"" << std::endl
294 <<
"\t\tConstitutive law: \"" <<
gExpr <<
"\"" << std::endl
295 <<
"\t\tDer/Eps: \"" <<
gExprDEps <<
"\"" << std::endl);
301 catch (std::exception& e) {
302 silent_cerr(
"GiNaCElasticConstitutiveLaw<doublereal, doublereal>::GiNaCElasticConstitutiveLaw: Update() failed (" << e.what() <<
")" << std::endl);
317 std::ostringstream eps;
318 std::ostringstream expr;
323 std::vector<std::string> epsilon;
324 std::vector<std::string> expression;
326 epsilon.push_back(eps.str());
327 expression.push_back(expr.str());
334 epsilon, expression));
342 out <<
"symbolic elastic isotropic, epsilon, \"" <<
gEps
343 <<
"\", expression, \"" <<
gExpr <<
"\"";
360 GiNaC::ex f_expr =
gExpr.subs(l);
363 + GiNaC::ex_to<GiNaC::numeric>(f_expr).to_double();
373 template <
class T,
class Tder>
387 std::vector<std::string>& epsilon,
388 std::vector<std::string>& expression);
391 virtual std::ostream&
Restart(std::ostream& out)
const;
392 virtual void Update(
const T& Eps,
const T& = 0.);
402 template <
class T,
class Tder>
405 std::vector<std::string>& epsilonPrime,
406 std::vector<std::string>& expression)
409 if (
typeid(T) ==
typeid(
Vec3)) {
412 }
else if (
typeid(T) ==
typeid(
Vec6)) {
423 for (
unsigned row = 0; row <
dim; row++) {
432 for (
unsigned row = 0; row <
dim; row++) {
433 gEpsPrime[row] =
new GiNaC::symbol(epsilonPrime[row]);
437 for (
unsigned row = 0; row <
dim; row++) {
439 gExpr[row] = GiNaC::ex(expression[row], l);
441 }
catch (std::exception& e) {
442 silent_cerr(
"GiNaCViscousConstitutiveLaw<T, Tder>: expression #" << row <<
" parsing "
443 "failed: " << e.what() << std::endl);
447 for (
unsigned col = 0; col <
dim; col++) {
451 }
catch (std::exception& e) {
452 silent_cerr(
"GiNaCViscousConstitutiveLaw<T, Tder>: expression #" << row <<
" differentiation "
453 "wrt/ EpsPrime #" << col <<
" failed: " << e.what()
460 silent_cout(
"\tGiNaCViscousConstitutiveLaw:" << std::endl);
461 for (
unsigned row = 0; row <
dim; row++) {
462 silent_cout(
"\t\tEpsPrime[" << row <<
"]: \"" << *
gEpsPrime[row] <<
"\"" << std::endl);
464 for (
unsigned row = 0; row <
dim; row++) {
465 silent_cout(
"\t\tConstitutive law[" << row <<
"]: \"" <<
gExpr[row] <<
"\"" << std::endl);
467 for (
unsigned row = 0; row <
dim; row++) {
468 for (
unsigned col = 0; col <
dim; col++) {
469 silent_cout(
"\t\tDer[" << row <<
"]/EpsPrime[" << row <<
"][" << col <<
"]: \"" <<
gExprDEpsPrime[row][col] <<
"\"" << std::endl);
477 catch (std::exception& e) {
478 silent_cerr(
"GiNaCViscousConstitutiveLaw<T, Tder>::GiNaCViscousConstitutiveLaw: Update() failed (" << e.what() <<
")" << std::endl);
483 template <
class T,
class Tder>
486 for (
unsigned row = 0; row < dim; row++) {
487 delete gEpsPrime[row];
496 std::vector<std::string> epsilonPrime(dim);
497 std::vector<std::string> expression(dim);
499 for (
unsigned row = 0; row < dim; row++) {
500 std::ostringstream epsPrime;
501 std::ostringstream expr;
503 epsPrime << *gEpsPrime[row];
506 epsilonPrime[row] = epsPrime.str();
507 expression[row] = expr.str();
514 epsilonPrime, expression));
519 template <
class T,
class Tder> std::ostream&
522 out <<
"symbolic viscous, epsilonPrime";
523 for (
unsigned row = 0; row < dim; row++) {
524 out <<
", \"" << *gEpsPrime[row] <<
"\"";
526 out <<
"\", expression";
527 for (
unsigned row = 0; row < dim; row++) {
528 out <<
", \"" << gExpr[row] <<
"\"";
534 template <
class T,
class Tder>
void
542 for (
unsigned row = 0; row < dim; row++) {
543 l.append(*gEpsPrime[row] == EpsPrime(row + 1));
546 for (
unsigned row = 0; row < dim; row++) {
547 GiNaC::ex f_expr = gExpr[row].subs(l);
550 = GiNaC::ex_to<GiNaC::numeric>(f_expr).to_double();
552 for (
unsigned col = 0; col < dim; col++) {
553 GiNaC::ex f_derEpsPrime = gExprDEpsPrime[row][col].subs(l);
556 = GiNaC::ex_to<GiNaC::numeric>(f_derEpsPrime).to_double();
575 std::vector<std::string>& epsilonPrime,
576 std::vector<std::string>& expression);
579 virtual std::ostream&
Restart(std::ostream& out)
const;
585 std::vector<std::string>& epsilonPrime,
586 std::vector<std::string>& expression)
588 gEpsPrime(epsilonPrime[0])
597 gExpr = GiNaC::ex(expression[0], l);
598 }
catch (std::exception& e) {
599 silent_cerr(
"GiNaCViscousConstitutiveLaw<doublereal, doublereal>: expression parsing failed: " << e.what() << std::endl);
605 }
catch (std::exception& e) {
606 silent_cerr(
"GiNaCViscousConstitutiveLaw<doublereal, doublereal>: expression differentiation wrt/ EpsPrime failed: " << e.what() << std::endl);
610 silent_cout(
"\tGiNaCViscousConstitutiveLaw:" << std::endl
611 <<
"\t\tEpsPrime: \"" <<
gEpsPrime <<
"\"" << std::endl
612 <<
"\t\tConstitutive law: \"" <<
gExpr <<
"\"" << std::endl
613 <<
"\t\tDer/EpsPrime: \"" <<
gExprDEpsPrime <<
"\"" << std::endl);
619 catch (std::exception& e) {
620 silent_cerr(
"GiNaCViscousConstitutiveLaw<doublereal, doublereal>::GiNaCViscousConstitutiveLaw: Update() failed (" << e.what() <<
")" << std::endl);
635 std::ostringstream epsPrime;
636 std::ostringstream expr;
641 std::vector<std::string> epsilonPrime;
642 std::vector<std::string> expression;
644 epsilonPrime.push_back(epsPrime.str());
645 expression.push_back(expr.str());
651 epsilonPrime, expression));
659 out <<
"symbolic viscous isotropic, "
661 <<
"\", expression, \"" <<
gExpr <<
"\"";
677 GiNaC::ex f_expr =
gExpr.subs(l);
680 + GiNaC::ex_to<GiNaC::numeric>(f_expr).to_double();
690 template <
class T,
class Tder>
696 std::vector<GiNaC::symbol *>
gEps;
707 std::vector<std::string>& epsilon,
708 std::vector<std::string>& epsilonPrime,
709 std::vector<std::string>& expression);
712 virtual std::ostream&
Restart(std::ostream& out)
const;
713 virtual void Update(
const T& Eps,
const T& = mb_zero<T>());
723 template <
class T,
class Tder>
727 std::vector<std::string>& epsilon,
728 std::vector<std::string>& epsilonPrime,
729 std::vector<std::string>& expression)
732 if (
typeid(T) ==
typeid(
Vec3)) {
735 }
else if (
typeid(T) ==
typeid(
Vec6)) {
748 for (
unsigned row = 0; row <
dim; row++) {
758 for (
unsigned row = 0; row <
dim; row++) {
759 gEps[row] =
new GiNaC::symbol(epsilon[row]);
760 l.append(*
gEps[row]);
761 gEpsPrime[row] =
new GiNaC::symbol(epsilonPrime[row]);
765 for (
unsigned row = 0; row <
dim; row++) {
767 gExpr[row] = GiNaC::ex(expression[row], l);
769 }
catch (std::exception& e) {
770 silent_cerr(
"GiNaCViscoElasticConstitutiveLaw<T, Tder>: expression #" << row <<
" parsing "
771 "failed: " << e.what() << std::endl);
775 for (
unsigned col = 0; col <
dim; col++) {
779 }
catch (std::exception& e) {
780 silent_cerr(
"GiNaCViscoElasticConstitutiveLaw<T, Tder>: expression #" << row <<
" differentiation "
781 "wrt/ Eps #" << col <<
"failed: "
782 << e.what() << std::endl);
789 }
catch (std::exception& e) {
790 silent_cerr(
"GiNaCViscoElasticConstitutiveLaw<T, Tder>: expression #" << row <<
" differentiation "
791 "wrt/ EpsPrime #" << col <<
"failed: "
792 << e.what() << std::endl);
798 silent_cout(
"\tGiNaCViscoElasticConstitutiveLaw:" << std::endl);
799 for (
unsigned row = 0; row <
dim; row++) {
800 silent_cout(
"\t\tEps[" << row <<
"]: \"" << *
gEps[row] <<
"\"" << std::endl);
802 for (
unsigned row = 0; row <
dim; row++) {
803 silent_cout(
"\t\tEpsPrime[" << row <<
"]: \"" << *
gEpsPrime[row] <<
"\"" << std::endl);
805 for (
unsigned row = 0; row <
dim; row++) {
806 silent_cout(
"\t\tConstitutive law[" << row <<
"]: \"" <<
gExpr[row] <<
"\"" << std::endl);
808 for (
unsigned row = 0; row <
dim; row++) {
809 for (
unsigned col = 0; col <
dim; col++) {
810 silent_cout(
"\t\tDer[" << row <<
"]/Eps[" << row <<
"][" << col <<
"]: \"" <<
gExprDEps[row][col] <<
"\"" << std::endl);
813 for (
unsigned row = 0; row <
dim; row++) {
814 for (
unsigned col = 0; col <
dim; col++) {
815 silent_cout(
"\t\tDer[" << row <<
"]/EpsPrime[" << row <<
"][" << col <<
"]: \"" <<
gExprDEpsPrime[row][col] <<
"\"" << std::endl);
823 catch (std::exception& e) {
824 silent_cerr(
"GiNaCViscoElasticConstitutiveLaw<T, Tder>::GiNaCViscoElasticConstitutiveLaw: Update() failed (" << e.what() <<
")" << std::endl);
829 template <
class T,
class Tder>
832 for (
unsigned row = 0; row < dim; row++) {
834 delete gEpsPrime[row];
843 std::vector<std::string> epsilon(dim);
844 std::vector<std::string> epsilonPrime(dim);
845 std::vector<std::string> expression(dim);
847 for (
unsigned row = 0; row < dim; row++) {
848 std::ostringstream eps;
849 std::ostringstream epsPrime;
850 std::ostringstream expr;
853 epsPrime << *gEpsPrime[row];
856 epsilon[row] = eps.str();
857 epsilonPrime[row] = epsPrime.str();
858 expression[row] = expr.str();
866 epsilon, epsilonPrime, expression));
871 template <
class T,
class Tder> std::ostream&
874 out <<
"symbolic viscoelastic, epsilon";
875 for (
unsigned row = 0; row < dim; row++) {
876 out <<
", \"" << *gEps[row] <<
"\"";
878 out <<
"\", epsilon prime";
879 for (
unsigned row = 0; row < dim; row++) {
880 out <<
", \"" << *gEpsPrime[row] <<
"\"";
882 out <<
"\", expression";
883 for (
unsigned row = 0; row < dim; row++) {
884 out <<
", \"" << gExpr[row] <<
"\"";
890 template <
class T,
class Tder>
void
901 for (
unsigned row = 0; row < dim; row++) {
902 l.append(*gEps[row] == e(row + 1));
903 l.append(*gEpsPrime[row] == EpsPrime(row + 1));
908 for (
unsigned row = 0; row < dim; row++) {
909 GiNaC::ex f_expr = gExpr[row].subs(l);
912 += GiNaC::ex_to<GiNaC::numeric>(f_expr).to_double();
914 for (
unsigned col = 0; col < dim; col++) {
915 GiNaC::ex f_derEps = gExprDEps[row][col].subs(l);
918 = GiNaC::ex_to<GiNaC::numeric>(f_derEps).to_double();
920 GiNaC::ex f_derEpsPrime = gExprDEpsPrime[row][col].subs(l);
923 = GiNaC::ex_to<GiNaC::numeric>(f_derEpsPrime).to_double();
945 std::vector<std::string>& epsilon,
946 std::vector<std::string>& epsilonPrime,
947 std::vector<std::string>& expression);
950 virtual std::ostream&
Restart(std::ostream& out)
const;
957 std::vector<std::string>& epsilon,
958 std::vector<std::string>& epsilonPrime,
959 std::vector<std::string>& expression)
961 gEps(epsilon[0]), gEpsPrime(epsilonPrime[0])
972 gExpr = GiNaC::ex(expression[0], l);
973 }
catch (std::exception& e) {
974 silent_cerr(
"GiNaCViscoElasticConstitutiveLaw<doublereal, doublereal>: expression parsing failed: " << e.what() << std::endl);
980 }
catch (std::exception& e) {
981 silent_cerr(
"GiNaCViscoElasticConstitutiveLaw<doublereal, doublereal>: expression differentiation wrt/ Eps failed: " << e.what() << std::endl);
987 }
catch (std::exception& e) {
988 silent_cerr(
"GiNaCViscoElasticConstitutiveLaw<doublereal, doublereal>: expression differentiation wrt/ EpsPrime failed: " << e.what() << std::endl);
992 silent_cout(
"\tGiNaCViscoElasticConstitutiveLaw:" << std::endl
993 <<
"\t\tEps: \"" <<
gEps <<
"\"" << std::endl
994 <<
"\t\tEpsPrime: \"" <<
gEpsPrime <<
"\"" << std::endl
995 <<
"\t\tConstitutive law: \"" <<
gExpr <<
"\"" << std::endl
996 <<
"\t\tDer/Eps: \"" <<
gExprDEps <<
"\"" << std::endl
997 <<
"\t\tDer/EpsPrime: \"" <<
gExprDEpsPrime <<
"\"" << std::endl);
1003 catch (std::exception& e) {
1004 silent_cerr(
"GiNaCViscoElasticConstitutiveLaw<doublereal, doublereal>::GiNaCViscoElasticConstitutiveLaw: Update() failed (" << e.what() <<
")" << std::endl);
1019 std::ostringstream eps;
1020 std::ostringstream epsPrime;
1021 std::ostringstream expr;
1027 std::vector<std::string> epsilon;
1028 std::vector<std::string> epsilonPrime;
1029 std::vector<std::string> expression;
1031 epsilon.push_back(eps.str());
1032 epsilonPrime.push_back(epsPrime.str());
1033 expression.push_back(expr.str());
1040 epsilon, epsilonPrime, expression));
1048 out <<
"symbolic elastic isotropic, "
1049 <<
"epsilon, \"" <<
gEps
1051 <<
"\", expression, \"" <<
gExpr <<
"\"";
1067 l.append(
gEps == e);
1073 GiNaC::ex f_expr =
gExpr.subs(l);
1076 + GiNaC::ex_to<GiNaC::numeric>(f_expr).to_double();
virtual std::ostream & Restart(std::ostream &out) const
GiNaCElasticConstitutiveLaw< Vec6, Mat6x6 > GiNaCElasticConstitutiveLaw6D
std::vector< GiNaC::ex > gExpr
std::vector< GiNaC::symbol * > gEps
#define MBDYN_EXCEPT_ARGS
GiNaCViscoElasticConstitutiveLaw< Vec6, Mat6x6 > GiNaCViscoElasticConstitutiveLaw6D
virtual void Update(const T &Eps, const T &=mb_zero< T >())
std::vector< GiNaC::symbol * > gEpsPrime
virtual ~GiNaCViscoElasticConstitutiveLaw(void)
GiNaCElasticConstitutiveLaw< Vec3, Mat3x3 > GiNaCElasticConstitutiveLaw3D
std::vector< GiNaC::ex > gExpr
virtual std::ostream & Restart(std::ostream &out) const
std::vector< GiNaC::ex > gExpr
virtual std::ostream & Restart_int(std::ostream &out) const
virtual std::ostream & Restart(std::ostream &out) const
virtual ConstitutiveLaw< T, Tder > * pCopy(void) const
GiNaCElasticConstitutiveLaw(const TplDriveCaller< T > *pDC, const T &PStress, std::vector< std::string > &epsilon, std::vector< std::string > &expression)
std::vector< std::vector< GiNaC::ex > > gExprDEpsPrime
virtual ConstitutiveLaw< T, Tder > * pCopy(void) const
virtual ~GiNaCElasticConstitutiveLaw(void)
GiNaCViscousConstitutiveLaw< Vec6, Mat6x6 > GiNaCViscousConstitutiveLaw6D
GiNaCViscousConstitutiveLaw< Vec3, Mat3x3 > GiNaCViscousConstitutiveLaw3D
virtual void Update(const T &Eps, const T &=0.)
virtual ConstitutiveLaw< T, Tder > * pCopy(void) const
GiNaCViscoElasticConstitutiveLaw(const TplDriveCaller< T > *pDC, const T &PStress, std::vector< std::string > &epsilon, std::vector< std::string > &epsilonPrime, std::vector< std::string > &expression)
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
GiNaCViscousConstitutiveLaw(const T &PStress, std::vector< std::string > &epsilon, std::vector< std::string > &expression)
std::vector< std::vector< GiNaC::ex > > gExprDEps
std::vector< std::vector< GiNaC::ex > > gExprDEpsPrime
GiNaCViscoElasticConstitutiveLaw< doublereal, doublereal > GiNaCViscoElasticConstitutiveLaw1D
GiNaCElasticConstitutiveLaw< doublereal, doublereal > GiNaCElasticConstitutiveLaw1D
std::vector< GiNaC::symbol * > gEpsPrime
virtual void Update(const T &Eps, const T &=0.)
GiNaCViscoElasticConstitutiveLaw< Vec3, Mat3x3 > GiNaCViscoElasticConstitutiveLaw3D
std::vector< GiNaC::symbol * > gEps
std::vector< std::vector< GiNaC::ex > > gExprDEps
virtual ~GiNaCViscousConstitutiveLaw(void)
GiNaCViscousConstitutiveLaw< doublereal, doublereal > GiNaCViscousConstitutiveLaw1D