diff --git a/dune/elasticity/assemblers/localhyperdualstiffness.hh b/dune/elasticity/assemblers/localhyperdualstiffness.hh index e3918385e15e2cd8d53cb8df61944011a2e472a4..c6ed85aa8623f1152315a418c445f14a5eced349 100644 --- a/dune/elasticity/assemblers/localhyperdualstiffness.hh +++ b/dune/elasticity/assemblers/localhyperdualstiffness.hh @@ -86,15 +86,14 @@ assembleGradientAndHessian(const LocalView& localView, for (size_t i=0; i<nDoubles; i++) { localGradient[i] = temp.gradient()[i]; - localHessian[i][i] = temp.hessian()[i][i]; + localHessian[i][i] = (temp.hessian())(i,i); for (size_t j=i+1; j<nDoubles; j++) { - localHessian[i][j] = temp.hessian()[i][j]; + localHessian[i][j] = (temp.hessian())(i,j); localHessian[j][i] = localHessian[i][j]; // Use symmetry of hessian } } - } } // namespace Dune::Elasticity diff --git a/dune/elasticity/common/hyperdual.hh b/dune/elasticity/common/hyperdual.hh index 6c6df1140860f6a29acb002095ef1145ffc24c83..3273aaf9bd6cdf401ede5a6f9340b4551c4f69ef 100644 --- a/dune/elasticity/common/hyperdual.hh +++ b/dune/elasticity/common/hyperdual.hh @@ -36,7 +36,7 @@ #include <math.h> #include<dune/common/fmatrix.hh> -#include <boost/hana/size.hpp> +#include<dune/fufem/symmetricmatrix.hh> class hyperdual{ @@ -44,7 +44,8 @@ public: const static int size = 29; - using Matrix = Dune::FieldMatrix<double,size,size>; +// using Matrix = Dune::FieldMatrix<double,size,size>; + using Matrix = Dune::Fufem::SymmetricMatrix<double,size>; using Vector = Dune::FieldVector<double,size>; //creation operators and function to manually set values @@ -195,7 +196,7 @@ hyperdual::Matrix hyperdual::hessian() const std::ostream& operator<<(std::ostream& output, const hyperdual& rhs) { - output << "value: " << rhs.value() << "\ngradient: " << rhs.gradient() << "\nhessian: " << rhs.hessian(); +// output << "value: " << rhs.value() << "\ngradient: " << rhs.gradient() << "\nhessian: " << rhs.hessian(); return output; } @@ -297,7 +298,7 @@ hyperdual& hyperdual::operator*= (hyperdual rhs) for(int i=0; i<size; i++) { for(int j=i; j<size; j++) - hess[i][j] = rhs.grad[j]*grad[i] + rhs.val*hess[i][j] + grad[j]*rhs.grad[i] + val*rhs.hess[i][j]; + hess.setEntry(i,j,rhs.grad[j]*grad[i] + rhs.val*hess(i,j) + grad[j]*rhs.grad[i] + val*rhs.hess(i,j)); grad[i] = val*rhs.grad[i] + rhs.val*grad[i]; } @@ -322,9 +323,9 @@ hyperdual& hyperdual::operator/= (hyperdual rhs) for(int i=0; i<size; i++) { for(int j=i; j<size; j++) - hess[i][j] = -(rhs.grad[j]*grad[i] + rhs.grad[i]*grad[j] + val*rhs.hess[i][j])/(rhs.val*rhs.val) - + hess[i][j]/rhs.val - +2.*val*rhs.grad[i]*rhs.grad[j]/(rhs.val*rhs.val*rhs.val); + hess.setEntry(i,j,-(rhs.grad[j]*grad[i] + rhs.grad[i]*grad[j] + val*rhs.hess(i,j))/(rhs.val*rhs.val) + + hess(i,j)/rhs.val + +2.*val*rhs.grad[i]*rhs.grad[j]/(rhs.val*rhs.val*rhs.val)); grad[i] = grad[i]/rhs.val - val*rhs.grad[i]/(rhs.val*rhs.val); } @@ -337,8 +338,8 @@ hyperdual& hyperdual::operator/= (hyperdual rhs) hyperdual& hyperdual::operator/= (double rhs) { val /= rhs; - grad /= rhs; - hess /= rhs; + grad *= (1./rhs); + hess *= (1./rhs); return *this; } @@ -360,7 +361,7 @@ hyperdual pow (hyperdual x, double a) for(int i=0; i<hyperdual::size; i++) { for(int j=i; j<hyperdual::size; j++) - temp.hess[i][j] = aAMinusOneXPowMinusTwo*x.grad[i]*x.grad[j] + aXPowMinusOne*x.hess[i][j]; + temp.hess.setEntry(i,j,aAMinusOneXPowMinusTwo*x.grad[i]*x.grad[j] + aXPowMinusOne*x.hess(i,j)); temp.grad[i] = aXPowMinusOne*x.grad[i]; } @@ -383,7 +384,7 @@ hyperdual exp(hyperdual x) for(int i=0; i<hyperdual::size; i++) { for(int j=i; j<hyperdual::size; j++) - temp.hess[i][j] = eX*(x.grad[i]*x.grad[j] + x.hess[i][j]); + temp.hess.setEntry(i,j,eX*(x.grad[i]*x.grad[j] + x.hess(i,j))); temp.grad[i] = eX*x.grad[i]; } @@ -402,7 +403,7 @@ hyperdual log(hyperdual x) for(int i=0; i<hyperdual::size; i++) { for(int j=i; j<hyperdual::size; j++) - temp.hess[i][j] = -inv*inv*(x.grad[i]*x.grad[j]) + inv*x.hess[i][j]; + temp.hess.setEntry(i,j,-inv*inv*(x.grad[i]*x.grad[j]) + inv*x.hess(i,j)); temp.grad[i] = inv*x.grad[i]; } @@ -420,7 +421,7 @@ hyperdual sin(hyperdual x) for(int i=0; i<hyperdual::size; i++) { for(int j=i; j<hyperdual::size; j++) - temp.hess[i][j] = -sinX*(x.grad[i]*x.grad[j]) + cosX*x.hess[i][j]; + temp.hess.setEntry(i,j,-sinX*(x.grad[i]*x.grad[j]) + cosX*x.hess(i,j)); temp.grad[i] = cosX*x.grad[i]; } @@ -438,7 +439,7 @@ hyperdual cos(hyperdual x) for(int i=0; i<hyperdual::size; i++) { for(int j=i; j<hyperdual::size; j++) - temp.hess[i][j] = -cosX*(x.grad[i]*x.grad[j]) - sinX*x.hess[i][j]; + temp.hess.setEntry(i,j,-cosX*(x.grad[i]*x.grad[j]) - sinX*x.hess(i,j)); temp.grad[i] = -sinX*x.grad[i]; } @@ -455,7 +456,7 @@ hyperdual tan(hyperdual x) for(int i=0; i<hyperdual::size; i++) { for(int j=i; j<hyperdual::size; j++) - temp.hess[i][j] = 2.*tanX*deriv*(x.grad[i]*x.grad[j]) + deriv*x.hess[i][j]; + temp.hess.setEntry(i,j,2.*tanX*deriv*(x.grad[i]*x.grad[j]) + deriv*x.hess(i,j)); temp.grad[i] = deriv*x.grad[i]; } @@ -474,7 +475,7 @@ hyperdual asin(hyperdual x) for(int i=0; i<hyperdual::size; i++) { for(int j=i; j<hyperdual::size; j++) - temp.hess[i][j] = deriv2*(x.grad[i]*x.grad[j]) + deriv*x.hess[i][j]; + temp.hess.setEntry(i,j,deriv2*(x.grad[i]*x.grad[j]) + deriv*x.hess(i,j)); temp.grad[i] = deriv*x.grad[i]; } @@ -493,7 +494,7 @@ hyperdual acos(hyperdual x) for(int i=0; i<hyperdual::size; i++) { for(int j=i; j<hyperdual::size; j++) - temp.hess[i][j] = deriv2*(x.grad[i]*x.grad[j]) + deriv*x.hess[i][j]; + temp.hess.setEntry(i,j,deriv2*(x.grad[i]*x.grad[j]) + deriv*x.hess(i,j)); temp.grad[i] = deriv*x.grad[i]; } @@ -512,7 +513,7 @@ hyperdual atan(hyperdual x) for(int i=0; i<hyperdual::size; i++) { for(int j=i; j<hyperdual::size; j++) - temp.hess[i][j] = deriv2*(x.grad[i]*x.grad[j]) + deriv*x.hess[i][j]; + temp.hess.setEntry(i,j,deriv2*(x.grad[i]*x.grad[j]) + deriv*x.hess(i,j)); temp.grad[i] = deriv*x.grad[i]; } @@ -531,7 +532,7 @@ hyperdual sqrt(hyperdual x) for(int i=0; i<hyperdual::size; i++) { for(int j=i; j<hyperdual::size; j++) - temp.hess[i][j] = deriv2*(x.grad[i]*x.grad[j]) + deriv*x.hess[i][j]; + temp.hess.setEntry(i,j,deriv2*(x.grad[i]*x.grad[j]) + deriv*x.hess(i,j)); temp.grad[i] = deriv*x.grad[i]; }