23 const std::vector<int> &boundary_nodes,
24 const std::vector<std::shared_ptr<Form>> &forms)
26 boundary_nodes_(boundary_nodes),
27 full_size_(full_size),
28 reduced_size_(full_size_ - boundary_nodes.size()),
30 rhs_assembler_(nullptr),
31 local_boundary_(nullptr),
32 n_boundary_samples_(0)
39 const std::vector<int> &boundary_nodes,
40 const std::vector<mesh::LocalBoundary> &local_boundary,
41 const int n_boundary_samples,
43 const std::shared_ptr<utils::PeriodicBoundary> &periodic_bc,
45 const std::vector<std::shared_ptr<Form>> &forms)
47 full_boundary_nodes_(boundary_nodes),
48 boundary_nodes_(periodic_bc ? periodic_bc->full_to_periodic(boundary_nodes) : boundary_nodes),
49 full_size_(full_size),
50 reduced_size_((periodic_bc ? periodic_bc->n_periodic_dof() : full_size) - boundary_nodes_.size()),
51 periodic_bc_(periodic_bc),
53 rhs_assembler_(&rhs_assembler),
54 local_boundary_(&local_boundary),
55 n_boundary_samples_(n_boundary_samples)
57 assert(std::is_sorted(boundary_nodes.begin(), boundary_nodes.end()));
58 assert(boundary_nodes.size() == 0 || (boundary_nodes.front() >= 0 && boundary_nodes.back() <
full_size_));
77 f->update_quantities(t, full);
115 THessian full_hessian;
145 form->set_apply_DBC(full,
val);
171 Eigen::MatrixXd result = Eigen::MatrixXd::Zero(
full_size(), 1);
177 template <
class FullMat,
class ReducedMat>
178 void NLProblem::full_to_reduced_aux(
const std::vector<int> &boundary_nodes,
const int full_size,
const int reduced_size,
const FullMat &full, ReducedMat &reduced)
const
190 assert(full.cols() == 1);
199 assert(std::is_sorted(boundary_nodes.begin(), boundary_nodes.end()));
203 for (
int i = 0; i < mid.size(); ++i)
205 if (k < boundary_nodes.size() && boundary_nodes[k] == i)
211 assert(j < reduced.size());
212 reduced(j++) = mid(i);
216 template <
class ReducedMat,
class FullMat>
217 void NLProblem::reduced_to_full_aux(
const std::vector<int> &boundary_nodes,
const int full_size,
const int reduced_size,
const ReducedMat &reduced,
const Eigen::MatrixXd &rhs, FullMat &full)
const
229 assert(reduced.cols() == 1);
232 assert(std::is_sorted(boundary_nodes.begin(), boundary_nodes.end()));
236 Eigen::MatrixXd mid(
reduced_size + boundary_nodes.size(), 1);
237 for (
int i = 0; i < mid.size(); ++i)
239 if (k < boundary_nodes.size() && boundary_nodes[k] == i)
246 mid(i) = reduced(j++);
252 template <
class FullMat,
class ReducedMat>
265 assert(full.cols() == 1);
276 for (
int i = 0; i < mid.size(); ++i)
278 if (k < boundary_nodes.size() && boundary_nodes[k] == i)
284 reduced(j++) = mid(i);
void set_bc(const std::vector< mesh::LocalBoundary > &local_boundary, const std::vector< int > &bounday_nodes, const int resolution, const std::vector< mesh::LocalBoundary > &local_neumann_boundary, Eigen::MatrixXd &rhs, const Eigen::MatrixXd &displacement=Eigen::MatrixXd(), const double t=1) const
virtual double max_step_size(const TVector &x0, const TVector &x1) override
virtual void init_lagging(const TVector &x)
virtual void hessian(const TVector &x, THessian &hessian) override
virtual bool is_step_collision_free(const TVector &x0, const TVector &x1)
std::vector< std::shared_ptr< Form > > forms_
virtual void post_step(const polysolve::nonlinear::PostStepData &data) override
virtual void update_lagging(const TVector &x, const int iter_num)
virtual bool is_step_valid(const TVector &x0, const TVector &x1) override
virtual double value(const TVector &x) override
virtual void solution_changed(const TVector &new_x) override
virtual void gradient(const TVector &x, TVector &gradv) override
virtual void line_search_begin(const TVector &x0, const TVector &x1) override
const int full_size_
Size of the full problem.
void line_search_begin(const TVector &x0, const TVector &x1) override
void full_to_reduced_aux_grad(const std::vector< int > &boundary_nodes, const int full_size, const int reduced_size, const FullMat &full, ReducedMat &reduced) const
virtual bool is_step_valid(const TVector &x0, const TVector &x1) override
NLProblem(const int full_size, const std::vector< int > &boundary_nodes, const std::vector< std::shared_ptr< Form > > &forms)
virtual void post_step(const polysolve::nonlinear::PostStepData &data) override
virtual TVector full_to_reduced_grad(const TVector &full) const
const std::vector< mesh::LocalBoundary > * local_boundary_
const int n_boundary_samples_
const assembler::RhsAssembler * rhs_assembler_
virtual TVector full_to_reduced(const TVector &full) const
virtual void update_quantities(const double t, const TVector &x)
virtual void gradient(const TVector &x, TVector &gradv) override
void reduced_to_full_aux(const std::vector< int > &boundary_nodes, const int full_size, const int reduced_size, const ReducedMat &reduced, const Eigen::MatrixXd &rhs, FullMat &full) const
void init_lagging(const TVector &x) override
const std::vector< int > full_boundary_nodes_
virtual bool is_step_collision_free(const TVector &x0, const TVector &x1) override
virtual TVector reduced_to_full(const TVector &reduced) const
void full_to_reduced_aux(const std::vector< int > &boundary_nodes, const int full_size, const int reduced_size, const FullMat &full, ReducedMat &reduced) const
void update_lagging(const TVector &x, const int iter_num) override
virtual Eigen::MatrixXd boundary_values() const
virtual void full_hessian_to_reduced_hessian(const THessian &full, THessian &reduced) const
virtual double value(const TVector &x) override
virtual double max_step_size(const TVector &x0, const TVector &x1) override
std::shared_ptr< utils::PeriodicBoundary > periodic_bc_
virtual void hessian(const TVector &x, THessian &hessian) override
void solution_changed(const TVector &new_x) override
void set_apply_DBC(const TVector &x, const bool val)
const std::vector< int > boundary_nodes_
void full_to_reduced_matrix(const int full_size, const int reduced_size, const std::vector< int > &removed_vars, const StiffnessMatrix &full, StiffnessMatrix &reduced)
Map a full size matrix to a reduced one by dropping rows and columns.