|
PolyFEM
|
Maps to dirichlet boundary. More...
#include <DirichletBoundaryVariableToSimulation.hpp>
Public Types | |
| using | VarFormPtrs = std::vector< std::shared_ptr< varform::DifferentiableVarForm > > |
| using | DiffCachePtrs = std::vector< std::shared_ptr< DiffCache > > |
Public Member Functions | |
| DirichletBoundaryVariableToSimulation (VarFormPtrs varforms, DiffCachePtrs diff_caches, CompositeParametrization parametrizations, Eigen::VectorXi active_boundary_ids, Eigen::VectorXi active_time_slices) | |
| Construct DirichletBoundaryVariableToSimulation. | |
| std::string | name () const override |
| ParameterType | parameter_type () const override |
| bool | affects_varform (const varform::DifferentiableVarForm &target) const override |
| Return true if current var2sim maps to target varform. | |
| void | update (const Eigen::VectorXd &x) override |
| Update forward simulation varforms from optimization variables. | |
| void | update_state_variables (const Eigen::VectorXd &x, Eigen::VectorXd &state_variables) const override |
| Update varform variables from optimization variables. | |
| Eigen::VectorXd | compute_adjoint_term (const Eigen::VectorXd &x) const override |
| Compute adjoint contribution of objective gradient. | |
| int | inverse_dof () const override |
| Compute optimization variables dof. | |
| Eigen::VectorXd | inverse_eval () const override |
| Compute optimization variables from forward simulation varform::DifferentiableVarForm. | |
| Eigen::VectorXd | apply_parametrization_jacobian (const Eigen::VectorXd &term, const Eigen::VectorXd &x) const override |
| Apply parametrization jacobian to compute the gradient w.r.t. | |
Public Member Functions inherited from polyfem::solver::VariableToSimulation | |
| virtual | ~VariableToSimulation ()=default |
Private Types | |
| using | BoundaryNodeMap = std::vector< std::vector< std::vector< int > > > |
| boundary order in this var2sim -> component (dim) -> offset in varform.boundary_state().boundary_nodes | |
Private Member Functions | |
| int | para_out_dof () const |
| void | build_boundary_node_maps () |
Private Attributes | |
| int | dim_ |
| int | time_steps_ |
| VarFormPtrs | varforms_ |
| DiffCachePtrs | diff_caches_ |
| CompositeParametrization | parametrization_ |
| Eigen::VectorXi | active_boundary_ids_ |
| Eigen::VectorXi | active_time_slices_ |
| std::vector< BoundaryNodeMap > | boundary_node_maps_ |
| boundary node map per varform. | |
Maps to dirichlet boundary.
Maps one boundary solution to all boundaries in one boundary selection.
Example 1: Suppose one boundary selection contains all vertices at x=0, this var2sim will map one solution (displacement xyz) to all vertices in the selection.
Example 2: Suppose there are two boundary selections – the left and right surface of a cube. This var2sim will map two solution, displacement to all vertices in their respective boundary seletion.
Expect optimiztion variable with layout: [ solution of boundary selection 1 at t0] [solution of boundary selection 2 at t0] ... [ solution of boundary selection 1 at t1] [solution of boundary selection 2 at t1] ...
Definition at line 29 of file DirichletBoundaryVariableToSimulation.hpp.
|
private |
boundary order in this var2sim -> component (dim) -> offset in varform.boundary_state().boundary_nodes
Definition at line 61 of file DirichletBoundaryVariableToSimulation.hpp.
| using polyfem::solver::DirichletBoundaryVariableToSimulation::DiffCachePtrs = std::vector<std::shared_ptr<DiffCache> > |
Definition at line 33 of file DirichletBoundaryVariableToSimulation.hpp.
| using polyfem::solver::DirichletBoundaryVariableToSimulation::VarFormPtrs = std::vector<std::shared_ptr<varform::DifferentiableVarForm> > |
Definition at line 32 of file DirichletBoundaryVariableToSimulation.hpp.
| polyfem::solver::DirichletBoundaryVariableToSimulation::DirichletBoundaryVariableToSimulation | ( | VarFormPtrs | varforms, |
| DiffCachePtrs | diff_caches, | ||
| CompositeParametrization | parametrizations, | ||
| Eigen::VectorXi | active_boundary_ids, | ||
| Eigen::VectorXi | active_time_slices | ||
| ) |
Construct DirichletBoundaryVariableToSimulation.
| [in] | varforms | Shared ptr to all forward sim varforms. |
| [in] | diff_caches | Shared ptr to all diff caches. |
| [in] | parametrizations | Parametrizations. |
| [in] | active_boundary_ids | Active Dirichlet boundary ids. Empty implies all active. |
| [in] | active_time_slices | Active time slices. Empty implies all active. |
| std::runtime_error | Throw if input is invalid. |
Definition at line 24 of file DirichletBoundaryVariableToSimulation.cpp.
References active_boundary_ids_, active_time_slices_, build_boundary_node_maps(), diff_caches_, polyfem::solver::is_active_dirichlet_boundary_ids_valid(), polyfem::solver::is_active_time_slices_valid(), polyfem::log_and_throw_adjoint_error(), time_steps_, and varforms_.
|
overridevirtual |
Return true if current var2sim maps to target varform.
Implements polyfem::solver::VariableToSimulation.
Definition at line 99 of file DirichletBoundaryVariableToSimulation.cpp.
References varforms_.
|
overridevirtual |
Apply parametrization jacobian to compute the gradient w.r.t.
to optimization variables.
| term | Gradient w.r.t. to full inherent dof (Ex. all vertices for shape var2sim) |
| x | Optimization variables. |
Implements polyfem::solver::VariableToSimulation.
Definition at line 237 of file DirichletBoundaryVariableToSimulation.cpp.
References polyfem::log_and_throw_adjoint_error(), and name().
|
private |
Definition at line 248 of file DirichletBoundaryVariableToSimulation.cpp.
References active_boundary_ids_, polyfem::basis::ElementBases::bases, polyfem::varform::FESpace::basis_list(), boundary_node_maps_, polyfem::varform::VarFormBoundaryState::boundary_nodes, polyfem::varform::DifferentiableVarForm::boundary_state(), dim_, polyfem::mesh::Mesh::get_boundary_id(), polyfem::varform::DifferentiableVarForm::get_mesh(), polyfem::varform::VarFormBoundaryState::local_boundary, polyfem::basis::ElementBases::local_nodes_for_primitive(), polyfem::varform::DifferentiableVarForm::primary_space(), and varforms_.
Referenced by DirichletBoundaryVariableToSimulation().
|
overridevirtual |
Compute adjoint contribution of objective gradient.
See arXiv:2205.13643.
Let objective function be J and optimization variable be x. This method computes all adjoint related terms in dJ/dx. For static case (E.q. 11), it's the second term. For dynamic case (E.q. 15), it's everything except ∂qJ.
| x[in] | Optimization variables. |
Implements polyfem::solver::VariableToSimulation.
Definition at line 139 of file DirichletBoundaryVariableToSimulation.cpp.
References active_boundary_ids_, active_time_slices_, polyfem::solver::CompositeParametrization::apply_jacobian(), boundary_node_maps_, diff_caches_, dim_, polyfem::solver::AdjointTools::dJ_dirichlet_transient_adjoint_term(), polyfem::get_adjoint_mat(), para_out_dof(), parametrization_, time_steps_, varforms_, and x.
|
overridevirtual |
Compute optimization variables dof.
| std::runtime_error | Throw if not implemented. |
Implements polyfem::solver::VariableToSimulation.
Definition at line 183 of file DirichletBoundaryVariableToSimulation.cpp.
References polyfem::solver::CompositeParametrization::inverse_size(), para_out_dof(), and parametrization_.
|
overridevirtual |
Compute optimization variables from forward simulation varform::DifferentiableVarForm.
| std::runtime_error | Throw if not implemented. |
Implements polyfem::solver::VariableToSimulation.
Definition at line 188 of file DirichletBoundaryVariableToSimulation.cpp.
References active_boundary_ids_, active_time_slices_, dim_, polyfem::solver::CompositeParametrization::inverse_eval(), polyfem::utils::json_as_array(), polyfem::log_and_throw_adjoint_error(), polyfem::logger(), para_out_dof(), parametrization_, time_steps_, varforms_, and y.
|
overridevirtual |
Implements polyfem::solver::VariableToSimulation.
Definition at line 89 of file DirichletBoundaryVariableToSimulation.cpp.
Referenced by apply_parametrization_jacobian().
|
private |
Definition at line 243 of file DirichletBoundaryVariableToSimulation.cpp.
References active_boundary_ids_, active_time_slices_, and dim_.
Referenced by compute_adjoint_term(), inverse_dof(), inverse_eval(), and update().
|
overridevirtual |
Implements polyfem::solver::VariableToSimulation.
Definition at line 94 of file DirichletBoundaryVariableToSimulation.cpp.
References polyfem::solver::DirichletBC.
|
overridevirtual |
Update forward simulation varforms from optimization variables.
| [in] | x | Optimization variables. |
Implements polyfem::solver::VariableToSimulation.
Definition at line 111 of file DirichletBoundaryVariableToSimulation.cpp.
References active_boundary_ids_, active_time_slices_, dim_, polyfem::solver::CompositeParametrization::eval(), para_out_dof(), parametrization_, varforms_, x, and y.
|
overridevirtual |
Update varform variables from optimization variables.
Compared to update() this method update abstract varform variables instead of writing directly to varform.
| [in] | x | Optimization variables. |
| [out] | state_variables | Abstract varform variables update dst. |
Implements polyfem::solver::VariableToSimulation.
Definition at line 133 of file DirichletBoundaryVariableToSimulation.cpp.
References polyfem::log_and_throw_adjoint_error().
|
private |
Definition at line 70 of file DirichletBoundaryVariableToSimulation.hpp.
Referenced by build_boundary_node_maps(), compute_adjoint_term(), DirichletBoundaryVariableToSimulation(), inverse_eval(), para_out_dof(), and update().
|
private |
Definition at line 71 of file DirichletBoundaryVariableToSimulation.hpp.
Referenced by compute_adjoint_term(), DirichletBoundaryVariableToSimulation(), inverse_eval(), para_out_dof(), and update().
|
private |
boundary node map per varform.
Definition at line 74 of file DirichletBoundaryVariableToSimulation.hpp.
Referenced by build_boundary_node_maps(), and compute_adjoint_term().
|
private |
Definition at line 67 of file DirichletBoundaryVariableToSimulation.hpp.
Referenced by compute_adjoint_term(), and DirichletBoundaryVariableToSimulation().
|
private |
Definition at line 63 of file DirichletBoundaryVariableToSimulation.hpp.
Referenced by build_boundary_node_maps(), compute_adjoint_term(), inverse_eval(), para_out_dof(), and update().
|
private |
Definition at line 68 of file DirichletBoundaryVariableToSimulation.hpp.
Referenced by compute_adjoint_term(), inverse_dof(), inverse_eval(), and update().
|
private |
Definition at line 64 of file DirichletBoundaryVariableToSimulation.hpp.
Referenced by compute_adjoint_term(), DirichletBoundaryVariableToSimulation(), and inverse_eval().
|
private |
Definition at line 66 of file DirichletBoundaryVariableToSimulation.hpp.
Referenced by affects_varform(), build_boundary_node_maps(), compute_adjoint_term(), DirichletBoundaryVariableToSimulation(), inverse_eval(), and update().