55 Eigen::MatrixXd reduced;
56 for (
int i = 0; i < rhs.cols(); i++)
58 Eigen::VectorXd reduced_vec = varform.
solve_data()->
nl_problem->full_to_reduced_grad(rhs.col(i));
60 reduced.setZero(reduced_vec.rows(), rhs.cols());
61 reduced.col(i) = reduced_vec;
71 Eigen::VectorXd partial_grad;
83 gradv = Eigen::VectorXd::Zero(
x.size());
133 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;
134 Eigen::VectorXd max_stress;
135 max_stress.setZero(
varform_->primary_space().basis_list().size());
137 Eigen::MatrixXd local_vals;
138 assembler::ElementAssemblyValues vals;
139 for (int e = start; e < end; e++)
141 if (interested_ids_.size() != 0 && interested_ids_.find(varform_->get_mesh().get_body_id(e)) == interested_ids_.end())
144 varform_->assembly_cache().compute(e, varform_->get_mesh().is_volume(), varform_->primary_space().basis_list()[e], varform_->primary_space().geometry_basis_list()[e], vals);
147 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);
149 Eigen::VectorXd stress_norms = local_vals.rowwise().norm();
150 max_stress(e) = std::max(max_stress(e), stress_norms.maxCoeff());
154 return max_stress.maxCoeff();
159 return Eigen::VectorXd();
161 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
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