Smith  0.1
Smith is an implicit thermal structural mechanics simulation code.
nonlinear_solve.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 
14 #pragma once
15 
16 #include <vector>
19 #include "smith/physics/common.hpp"
20 
21 namespace smith {
22 
23 class WeakForm;
24 class NonlinearBlockSolverBase;
25 class BoundaryConditionManager;
26 class DirichletBoundaryConditions;
27 
29 static constexpr size_t invalid_block_index = std::numeric_limits<size_t>::max() - 1;
30 
37 // with unknowns (with respect to the solver) being a, and b.
38 // r1 has unknowns a,b in the ‘slots’ 0, 1
39 // r2 has unknowns a,b, in the ‘slots’ 3,0
47 std::vector<FieldState> block_solve(const std::vector<WeakForm*>& residual_evals,
48  const std::vector<std::vector<size_t>> block_indices, const FieldState& shape_disp,
49  const std::vector<std::vector<FieldState>>& states,
50  const std::vector<std::vector<FieldState>>& params, const TimeInfo& time_info,
51  const NonlinearBlockSolverBase* solver,
52  const std::vector<const BoundaryConditionManager*>& bc_managers);
53 
64 inline FieldState solve(const WeakForm& residual_eval, const FieldState& shape_disp,
65  const std::vector<FieldState>& states, const std::vector<FieldState>& params,
66  const TimeInfo& time_info, const NonlinearBlockSolverBase& solver,
67  const DirichletBoundaryConditions& bcs, size_t unknown_state_index = 0)
68 {
69  std::vector<const BoundaryConditionManager*> bc_managers{&bcs.getBoundaryConditionManager()};
70  auto solutions = block_solve({const_cast<WeakForm*>(&residual_eval)}, {{unknown_state_index}}, shape_disp, {states},
71  {params}, time_info, &solver, bc_managers);
72  return solutions[0];
73 }
74 
76 inline FieldState solve([[maybe_unused]] const FieldState& initial_guess, const FieldState& shape_disp,
77  const std::vector<FieldState>& weak_form_inputs, const TimeInfo& time_info,
78  const WeakForm& residual_eval, const NonlinearBlockSolverBase& solver,
79  const DirichletBoundaryConditions& bcs, size_t unknown_state_index = 0)
80 {
81  return solve(residual_eval, shape_disp, weak_form_inputs, {}, time_info, solver, bcs, unknown_state_index);
82 }
83 
84 } // namespace smith
A generic class for setting Dirichlet boundary conditions on arbitrary physics.
const smith::BoundaryConditionManager & getBoundaryConditionManager() const
Return the smith BoundaryConditionManager.
Abstract interface for nonlinear block solvers that provide both forward and adjoint solves.
Abstract WeakForm class.
Definition: weak_form.hpp:36
A file defining some enums and structs that are used by the different physics modules.
Contains DirichletBoundaryConditions class for interaction with the differentiable solve interfaces.
Accelerator functionality.
Definition: smith.cpp:36
gretl::State< FEFieldPtr, FEDualPtr > FieldState
typedef
Definition: field_state.hpp:22
SMITH_HOST_DEVICE auto max(dual< gradient_type > a, double b)
Implementation of max for dual numbers.
Definition: dual.hpp:229
std::vector< FieldState > solve(const std::vector< std::shared_ptr< WeakForm >> &weak_forms, const FieldStore &field_store, const CoupledSystemSolver *solver, const TimeInfo &time_info, const std::vector< FieldState > &params)
Solve a set of weak forms.
std::vector< FieldState > block_solve(const std::vector< WeakForm * > &residual_evals, const std::vector< std::vector< size_t >> block_indices, const FieldState &shape_disp, const std::vector< std::vector< FieldState >> &states, const std::vector< std::vector< FieldState >> &params, const TimeInfo &time_info, const NonlinearBlockSolverBase *solver, const std::vector< const BoundaryConditionManager * > &bc_managers)
Solve a block nonlinear system of equations as defined by the vector of weak form.
struct storing time and timestep information
Definition: common.hpp:18