21 Eigen::Matrix<double,6,1> alpha,D,strain0,strainRate,stress0,stressRate;
47 trial(std::move(
u)),alpha(settings.alpha),D(
Vector6::Zero()),
48 strain0(settings.g0),strainRate(settings.g0Dot),stress0(settings.f0),stressRate(settings.f0Dot)
50 if(!alpha.allFinite() || (alpha.array()<0.0).any() || !strain0.allFinite() ||
51 !strainRate.allFinite() || !stress0.allFinite() || !stressRate.allFinite())
53 throw std::invalid_argument(
"Invalid FEM loading inputs; stiffnessRatio must be finite and nonnegative.");
55 const auto& fe=trial->fe();
56 volume=fe.mesh.volume();
57 length=(fe.mesh.xMax()-fe.mesh.xMin()).norm();
58 meanStrain=Eigen::MatrixXd::Zero(6,trial->gSize());
60 for(
const auto& entry : fe.elements())
62 const auto& e=entry.second;
63 for(size_t k=0;k<Q::quadratureOrder;++k)
65 const auto bary=BarycentricTraits<3>::x2l(Q::abscissa(k));
66 const auto local=(trial->sfmDef(e,bary)*(e.absJ(bary)*Q::weight(k)/volume)).eval();
67 for(int n=0;n<Trial::nodesPerElement;++n)
69 meanStrain.middleCols(3*e.node(n).gID,3)+=local.middleCols(3*n,3);
84 const auto& basis=fe.mesh.periodicBasis();
85 periodicDirections=Eigen::MatrixXd::Zero(3,basis.cols());
88 periodicDirections=basis.householderQr().householderQ()*Eigen::MatrixXd::Identity(3,basis.cols());
129 Eigen::MatrixXd modes=Eigen::MatrixXd::Zero(trial->gSize(),3*periodicDirections.cols());
130 for(
size_t node=0;node<trial->fe().nodeSize();++node)
132 const Eigen::VectorXd shift=periodicDirections.transpose()*trial->fe().periodicShift(node)/length;
133 for(Eigen::Index
j=0;
j<shift.size();++
j)
135 modes.block<3,3>(3*node,3*
j)=shift(
j)*Eigen::Matrix3d::Identity();