Smith  0.1
Smith is an implicit thermal structural mechanics simulation code.
constraint.hpp
Go to the documentation of this file.
1 // Copyright Lawrence Livermore National Security, LLC and
2 // other Smith Project Developers. See the top-level LICENSE file for
3 // details.
4 //
5 // SPDX-License-Identifier: (BSD-3-Clause)
6 
14 #pragma once
15 
16 #include <vector>
17 #include "smith/physics/common.hpp"
19 
20 namespace mfem {
21 class Vector;
22 class HypreParMatrix;
23 } // namespace mfem
24 
25 namespace smith {
26 
27 class FiniteElementState;
28 
30 class Constraint {
31  public:
33  Constraint(const std::string& name = "constraint") : name_(name) {}
34 
36  virtual ~Constraint() {}
37 
47  virtual mfem::Vector evaluate(double time, double dt, const std::vector<ConstFieldPtr>& fields,
48  bool update_fields = true) const = 0;
49 
61  virtual std::unique_ptr<mfem::HypreParMatrix> jacobian(double time, double dt,
62  const std::vector<ConstFieldPtr>& fields, int direction,
63  bool update_fields = true,
64  bool fresh_derivative = true) const = 0;
65 
78  virtual std::unique_ptr<mfem::HypreParMatrix> jacobian_tilde(double time, double dt,
79  const std::vector<ConstFieldPtr>& fields, int direction,
80  bool update_fields = true,
81  bool fresh_derivative = true) const
82  {
83  return jacobian(time, dt, fields, direction, update_fields, fresh_derivative);
84  };
85 
99  virtual mfem::Vector residual_contribution(double time, double dt, const std::vector<ConstFieldPtr>& fields,
100  const mfem::Vector& multipliers, int direction, bool update_fields = true,
101  bool fresh_derivative = true) const
102  {
103  std::unique_ptr<mfem::HypreParMatrix> jac =
104  jacobian_tilde(time, dt, fields, direction, update_fields, fresh_derivative);
105  mfem::Vector y(jac->Width());
106  y = 0.0;
107  SLIC_ERROR_ROOT_IF(jac->Height() != multipliers.Size(), "Incompatible matrix and vector sizes.");
108  jac->MultTranspose(multipliers, y);
109  return y;
110  };
111 
125  virtual std::unique_ptr<mfem::HypreParMatrix> residual_contribution_jacobian(
126  [[maybe_unused]] double time, [[maybe_unused]] double dt,
127  [[maybe_unused]] const std::vector<ConstFieldPtr>& fields, [[maybe_unused]] const mfem::Vector& multipliers,
128  [[maybe_unused]] int direction, [[maybe_unused]] bool update_fields = true,
129  [[maybe_unused]] bool fresh_derivative = true) const
130  {
131  SLIC_ERROR_ROOT(std::format("Base class must override residual_contribution_jacobian before usage"));
132  std::unique_ptr<mfem::HypreParMatrix> res_contr_jacobian = nullptr;
133  return res_contr_jacobian;
134  };
135 
137  std::string name() const { return name_; }
138 
139  private:
141  std::string name_;
142 };
143 
144 } // namespace smith
Abstract constraint class.
Definition: constraint.hpp:30
virtual std::unique_ptr< mfem::HypreParMatrix > jacobian_tilde(double time, double dt, const std::vector< ConstFieldPtr > &fields, int direction, bool update_fields=true, bool fresh_derivative=true) const
Virtual interface for computing constraint Jacobian_tilde from a vector of smith::FiniteElementState*...
Definition: constraint.hpp:78
virtual mfem::Vector residual_contribution(double time, double dt, const std::vector< ConstFieldPtr > &fields, const mfem::Vector &multipliers, int direction, bool update_fields=true, bool fresh_derivative=true) const
Virtual interface for computing residual contribution Jacobian_tilde^(Transpose) * (Lagrange multipli...
Definition: constraint.hpp:99
virtual mfem::Vector evaluate(double time, double dt, const std::vector< ConstFieldPtr > &fields, bool update_fields=true) const =0
Virtual interface for computing the constraint, given a vector of smith::FiniteElementState*.
Constraint(const std::string &name="constraint")
base constructor takes the name of the physics
Definition: constraint.hpp:33
virtual std::unique_ptr< mfem::HypreParMatrix > jacobian(double time, double dt, const std::vector< ConstFieldPtr > &fields, int direction, bool update_fields=true, bool fresh_derivative=true) const =0
Virtual interface for computing constraint Jacobian from a vector of smith::FiniteElementState*.
std::string name() const
name
Definition: constraint.hpp:137
virtual std::unique_ptr< mfem::HypreParMatrix > residual_contribution_jacobian([[maybe_unused]] double time, [[maybe_unused]] double dt, [[maybe_unused]] const std::vector< ConstFieldPtr > &fields, [[maybe_unused]] const mfem::Vector &multipliers, [[maybe_unused]] int direction, [[maybe_unused]] bool update_fields=true, [[maybe_unused]] bool fresh_derivative=true) const
Virtual interface for computing residual contribution Jacobian_tilde^(Transpose) * (Lagrange multipli...
Definition: constraint.hpp:125
virtual ~Constraint()
destructor
Definition: constraint.hpp:36
A file defining some enums and structs that are used by the different physics modules.
Defines common types and helper functions for using the residual and scalar_objective classes.
Accelerator functionality.
Definition: smith.cpp:36