Skip to content
Snippets Groups Projects
Commit d3d666b1 authored by Jonathan Youett's avatar Jonathan Youett
Browse files

Store assemblers by value

parent 6418d2ff
Branches
Tags
No related merge requests found
......@@ -190,14 +190,14 @@ public:
//! Return the local assembler of the first derivative of the strain energy
typename Base::LocalLinearization& firstDerivative(std::shared_ptr<GridFunction> displace) {
localLinearization_->setConfiguration(displace);
return *localLinearization_;
localLinearisation_.setConfiguration(displace);
return localLinearisation_;
}
//! Return the local assembler of the second derivative of the strain energy
typename Base::LocalHessian& secondDerivative(std::shared_ptr<GridFunction> displace) {
localHessian_->setConfiguration(displace);
return *localHessian_;
localHessian_.setConfiguration(displace);
return localHessian_;
}
private:
......@@ -245,15 +245,15 @@ private:
//! Construct the local assembler members
void constructAssemblers() {
localLinearization_ = std::make_shared<MonRivLinearization>(a_, b_, c_, d_, e_, k_);
localHessian_ = std::make_shared<MonRivHessian>(a_, b_, c_, d_, e_, k_);
localLinearisation_ = MonRivLinearisation(a_, b_, c_, d_, e_, k_);
localHessian_ = MonRivHessian(a_, b_, c_, d_, e_, k_);
}
//! First derivative of the strain energy
std::shared_ptr<MonRivLinearization> localLinearization_;
MonRivLinearisation localLinearisation_;
//! Second derivative of the strain energy
std::shared_ptr<MonRivHessian> localHessian_;
MonRivHessian localHessian_;
//! Elasticity modulus
field_type E_;
......
......@@ -67,25 +67,19 @@ public:
NeoHookeanMaterial() = default;
template <class BasisT>
NeoHookeanMaterial(BasisT&& basis, ReturnType E, ReturnType nu) :
Base(std::forward<BasisT>(basis))
NeoHookeanMaterial(BasisT&& basis, field_type E, field_type nu)
{
lambda_ = E*nu / ((1+nu)*(1-2*nu));
mu_ = E / (2*(1+nu));
localLinearization_ = std::make_shared<NeoLinearization>(lambda_,mu_);
localHessian_ = std::make_shared<NeoHessian>(lambda_,mu_);
setup(std::forward<BasisT>(basis), E, nu);
}
template <class BasisT>
void setup(BasisT&& basis, field_type E, field_type nu)
{
lambda_ = E*nu / ((1+nu)*(1-2*nu));
mu_ = E / (2*(1+nu));
localLinearization_ = std::make_shared<NeoLinearization>(lambda_,mu_);
localHessian_ = std::make_shared<NeoHessian>(lambda_,mu_);
localLinearization_ = NeoLinearisation{lambda_, mu_};
localHessian_ = NeoHessian{lambda_, mu_};
this->setBasis(std::forward<BasisT>(basis));
}
......@@ -212,23 +206,22 @@ public:
//! Return the local assembler of the first derivative of the strain energy
typename Base::LocalLinearization& firstDerivative(std::shared_ptr<GridFunction> displace) {
localLinearization_->setConfiguration(displace);
return *localLinearization_;
localLinearization_.setConfiguration(displace);
return localLinearization_;
}
//! Return the local assembler of the second derivative of the strain energy
typename Base::LocalHessian& secondDerivative(std::shared_ptr<GridFunction> displace) {
localHessian_->setConfiguration(displace);
return *localHessian_;
localHessian_.setConfiguration(displace);
return localHessian_;
}
private:
//! First derivative of the strain energy
std::shared_ptr<NeoLinearization> localLinearization_;
NeoLinearisation localLinearization_;
//! Second derivative of the strain energy
std::shared_ptr<NeoHessian> localHessian_;
NeoHessian localHessian_;
//! First Lame constant
field_type lambda_;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment