7#include <range/v3/view.hpp>
8#include <range/v3/view/transform.hpp>
25 std::vector<double>
const&& absolute_epsilons)
31 "Numerical Jacobian assembler requires perturbation values "
32 "(epsilons) for finite difference approximation, but none were "
34 "Please specify <epsilons> in the <jacobian_assembler> section "
35 "of your project file.\n"
36 "Example: <epsilons>1e-8 1e-8</epsilons> for a process with 2 "
37 "non-deformation variables.");
46 double const t,
double const dt,
47 std::vector<double>
const& local_x,
48 std::vector<double>
const& local_x_prev,
49 std::vector<double>& local_b_data,
50 std::vector<double>& local_Jac_data) = 0;
56 double const , Eigen::VectorXd
const& ,
57 Eigen::VectorXd
const& ,
int const ,
58 std::vector<double>& ,
59 std::vector<double>& )
65 virtual std::unique_ptr<AbstractJacobianAssembler>
copy()
const = 0;
74 int const max_non_deformation_dofs_per_node)
const
84 if (num_abs_eps != max_non_deformation_dofs_per_node)
87 "Mismatch in numerical Jacobian perturbation configuration:\n"
88 " Provided epsilons: {:d}\n"
89 " Required epsilons: {:d} (one per non-deformation variable "
91 "Each non-deformation variable needs exactly one epsilon value "
92 "for numerical differentiation.\n"
93 "Deformation variables use analytical Jacobian and do not "
95 "Please adjust the <epsilons> array in your project file to "
96 "match the number of required components.",
97 num_abs_eps, max_non_deformation_dofs_per_node);
102 std::vector<int>
const& non_deformation_component_ids)
124 std::vector<int>
const& non_deformation_component_ids)
132 namespace rv = ranges::views;
135 [
this](
int comp_id) ->
double const&
void setNonDeformationComponentIDs(std::vector< int > const &non_deformation_component_ids)
virtual void assembleWithJacobian(LocalAssemblerInterface &local_assembler, double const t, double const dt, std::vector< double > const &local_x, std::vector< double > const &local_x_prev, std::vector< double > &local_b_data, std::vector< double > &local_Jac_data)=0
auto getVariableComponentEpsilonsView() const
virtual std::unique_ptr< AbstractJacobianAssembler > copy() const =0
AbstractJacobianAssembler(std::vector< double > const &&absolute_epsilons)
virtual void assembleWithJacobianForStaggeredScheme(LocalAssemblerInterface &, double const, double const, Eigen::VectorXd const &, Eigen::VectorXd const &, int const, std::vector< double > &, std::vector< double > &)
std::vector< double > const absolute_epsilons_
void setNonDeformationComponentIDsNoSizeCheck(std::vector< int > const &non_deformation_component_ids)
AbstractJacobianAssembler()
std::vector< int > non_deformation_component_ids_
auto isPerturbationEnabled() const
virtual ~AbstractJacobianAssembler()=default
void checkPerturbationSize(int const max_non_deformation_dofs_per_node) const