Smith  0.1
Smith is an implicit thermal structural mechanics simulation code.
reaction.hpp
Go to the documentation of this file.
1 // Copyright (c) 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 
13 #pragma once
14 
15 #include <string>
19 
20 namespace smith {
21 
26 inline auto evaluateWeakForm(const std::shared_ptr<WeakForm>& weak_form, const TimeInfo& time_info,
27  FieldState shape_disp, const std::vector<FieldState>& field_states,
28  FieldState field_for_residual_space)
29 {
30  std::vector<gretl::StateBase> all_state_bases{shape_disp};
31  for (auto& f : field_states) all_state_bases.push_back(f);
32  all_state_bases.push_back(field_for_residual_space);
33 
34  auto z = shape_disp.create_state<FEDualPtr, FEFieldPtr>(all_state_bases, zero_state_from_dual());
35 
36  z.set_eval([=](const gretl::UpstreamStates& inputs, gretl::DownstreamState& output) {
38 
39  size_t num_fields = inputs.size() - 2;
40  ConstFieldPtr shape_disp_ = inputs[0].get<FEFieldPtr>().get();
41  std::vector<ConstFieldPtr> fields(num_fields);
42  for (size_t field_index = 0; field_index < num_fields; ++field_index) {
43  fields[field_index] = inputs[field_index + 1].get<FEFieldPtr>().get();
44  }
45  ConstFieldPtr field_for_residual_space_ = inputs[num_fields + 1].get<FEFieldPtr>().get();
46 
47  FEDualPtr R = std::make_shared<FiniteElementDual>(field_for_residual_space_->space(),
48  "residual"); // set up output pointer
49  // evaluate the residual with zero acceleration contribution
50  *R = weak_form->residual(time_info, shape_disp_, fields);
51  output.set<FEDualPtr, FEFieldPtr>(R);
52  });
53 
54  z.set_vjp([=](gretl::UpstreamStates& inputs, const gretl::DownstreamState& output) {
56 
57  const FEDualPtr Z = output.get<FEDualPtr, FEFieldPtr>();
58  const FEFieldPtr Z_dual = output.get_dual<FEFieldPtr, FEDualPtr>();
59  FiniteElementState Z_dual_state(Z_dual->space(), Z_dual->name());
60  Z_dual_state = *Z_dual;
61 
62  size_t num_fields = inputs.size() - 2;
63  std::vector<ConstFieldPtr> fields(num_fields);
64  for (size_t field_index = 0; field_index < num_fields; ++field_index) {
65  fields[field_index] = inputs[field_index + 1].get<FEFieldPtr>().get();
66  }
67 
68  std::vector<DualFieldPtr> field_sensitivities(num_fields);
69  for (size_t field_index = 0; field_index < num_fields; ++field_index) {
70  field_sensitivities[field_index] = inputs[field_index + 1].get_dual<FEDualPtr, FEFieldPtr>().get();
71  }
72 
73  ConstFieldPtr shape_disp_ = inputs[0].get<FEFieldPtr>().get();
74  DualFieldPtr shape_disp_sensitivity = inputs[0].get_dual<FEDualPtr, FEFieldPtr>().get();
75 
76  // set the dual fields for each input, using the call to residual that pulls the derivative
77  weak_form->vjp(time_info, shape_disp_, fields, {}, &Z_dual_state, shape_disp_sensitivity, field_sensitivities, {});
78  });
79 
80  return z.finalize();
81 }
82 
83 } // namespace smith
Class for encapsulating the dual vector space of a finite element space (i.e. the space of linear for...
Class for encapsulating the critical MFEM components of a primal finite element field.
Contains DirichletBoundaryConditions class for interaction with the differentiable solve interfaces.
Accelerator functionality.
Definition: smith.cpp:36
constexpr T & get(variant< T0, T1 > &v)
Returns the variant member of specified type.
Definition: variant.hpp:338
std::shared_ptr< FiniteElementState > FEFieldPtr
typedef
Definition: field_state.hpp:20
auto evaluateWeakForm(const std::shared_ptr< WeakForm > &weak_form, const TimeInfo &time_info, FieldState shape_disp, const std::vector< FieldState > &field_states, FieldState field_for_residual_space)
gretl-function implementation which evaluates the residual force (which is minus the mechanical force...
Definition: reaction.hpp:26
gretl::State< FEFieldPtr, FEDualPtr > FieldState
typedef
Definition: field_state.hpp:22
std::shared_ptr< FiniteElementDual > FEDualPtr
typedef
Definition: field_state.hpp:21
FiniteElementState const * ConstFieldPtr
using
Definition: field_types.hpp:36
#define SMITH_MARK_FUNCTION
Definition: profiling.hpp:90
struct storing time and timestep information
Definition: common.hpp:18
functor which takes a std::shared_ptr<FiniteElementDual>, and returns a zero-valued std::shared_ptr<F...
Definition: field_state.hpp:39
Specifies interface for evaluating weak form residuals and their gradients.