22 std::shared_ptr<const varform::DifferentiableVarForm> varform,
23 std::shared_ptr<const DiffCache> diff_cache,
const json &args)
25 varform_(std::move(varform)),
26 diff_cache_(std::move(diff_cache)),
27 dimensions_(args[
"dimensions"].get<std::vector<int>>())
47 Eigen::VectorXd extended = Eigen::VectorXd::Zero(problem->full_size() + dimension * dimension);
49 return problem->extended_to_reduced_grad(extended);
86 Eigen::MatrixXd reduced;
87 for (
int i = 0; i < rhs.cols(); i++)
89 Eigen::VectorXd reduced_vec = varform.
solve_data()->
nl_problem->full_to_reduced_grad(rhs.col(i));
91 reduced.setZero(reduced_vec.rows(), rhs.cols());
92 reduced.col(i) = reduced_vec;
102 Eigen::VectorXd partial_grad;
114 gradv = Eigen::VectorXd::Zero(
x.size());
164 const double t =
varform_->get_problem().is_time_dependent() ? time_step *
varform_->get_args()[
"time"][
"dt"].get<
double>() +
varform_->get_args()[
"time"][
"t0"].get<
double>() : 0;
165 Eigen::VectorXd max_stress;
166 max_stress.setZero(
varform_->primary_space().basis_list().size());
168 Eigen::MatrixXd local_vals;
169 assembler::ElementAssemblyValues vals;
170 for (int e = start; e < end; e++)
172 if (interested_ids_.size() != 0 && interested_ids_.find(varform_->get_mesh().get_body_id(e)) == interested_ids_.end())
175 varform_->assembly_cache().compute(e, varform_->get_mesh().is_volume(), varform_->primary_space().basis_list()[e], varform_->primary_space().geometry_basis_list()[e], vals);
178 dynamic_cast<const assembler::ElasticityAssembler &>(varform_->primary_assembler()).compute_stress_tensor(assembler::OutputData(t, e, varform_->primary_space().basis_list()[e], varform_->primary_space().geometry_basis_list()[e], vals.quadrature.points, diff_cache_->u(time_step)), ElasticityTensorType::PK1, local_vals);
180 Eigen::VectorXd stress_norms = local_vals.rowwise().norm();
181 max_stress(e) = std::max(max_stress(e), stress_norms.maxCoeff());
185 return max_stress.maxCoeff();
190 return Eigen::VectorXd();
192 void MaxStressForm::compute_partial_gradient_step(
const int time_step,
const Eigen::VectorXd &
x, Eigen::VectorXd &gradv)
const
Storage for additional data required by differntial code.
virtual bool is_time_dependent() const
int dimension() const
utily for dimension
std::shared_ptr< solver::NLProblem > nl_problem
Eigen::VectorXd compute_adjoint_term(const Eigen::VectorXd &x) const
void maybe_parallel_for(int size, const std::function< void(int, int, int)> &partial_for)
spdlog::logger & adjoint_logger()
Retrieves the current logger for adjoint.
void log_and_throw_adjoint_error(const std::string &msg)
Eigen::SparseMatrix< double, Eigen::ColMajor > StiffnessMatrix