DOLFIN-X
DOLFIN-X C++ interface
Form.h
1 // Copyright (C) 2007-2014 Anders Logg
2 //
3 // This file is part of DOLFINX (https://www.fenicsproject.org)
4 //
5 // SPDX-License-Identifier: LGPL-3.0-or-later
6 
7 #pragma once
8 
9 #include "FormCoefficients.h"
10 #include "FormIntegrals.h"
11 #include <functional>
12 #include <map>
13 #include <memory>
14 #include <petscsys.h>
15 #include <set>
16 #include <string>
17 #include <vector>
18 
19 // Forward declaration
20 struct ufc_form;
21 
22 namespace dolfinx
23 {
24 
25 namespace function
26 {
27 class Constant;
28 class FunctionSpace;
29 } // namespace function
30 
31 namespace mesh
32 {
33 class Mesh;
34 template <typename T>
35 class MeshTags;
36 } // namespace mesh
37 
38 namespace fem
39 {
40 
64 
65 class Form
66 {
67 public:
76  Form(const std::vector<std::shared_ptr<const function::FunctionSpace>>&
77  function_spaces,
79  const std::vector<
80  std::pair<std::string, std::shared_ptr<const function::Constant>>>
81  constants);
82 
88  explicit Form(
89  const std::vector<std::shared_ptr<const function::FunctionSpace>>&
90  function_spaces);
91 
93  Form(Form&& form) = default;
94 
96  virtual ~Form() = default;
97 
101  int rank() const;
102 
106  void set_coefficients(
107  std::map<std::size_t, std::shared_ptr<const function::Function>>
108  coefficients);
109 
113  void set_coefficients(
114  std::map<std::string, std::shared_ptr<const function::Function>>
115  coefficients);
116 
121  int original_coefficient_position(int i) const;
122 
129  void
130  set_constants(std::map<std::string, std::shared_ptr<const function::Constant>>
131  constants);
132 
141  void set_constants(
142  std::vector<std::shared_ptr<const function::Constant>> constants);
143 
146  bool all_constants_set() const;
147 
150  std::set<std::string> get_unset_constants() const;
151 
155  void set_mesh(std::shared_ptr<const mesh::Mesh> mesh);
156 
159  std::shared_ptr<const mesh::Mesh> mesh() const;
160 
164  std::shared_ptr<const function::FunctionSpace> function_space(int i) const;
165 
167  void set_tabulate_tensor(
168  FormIntegrals::Type type, int i,
169  std::function<void(PetscScalar*, const PetscScalar*, const PetscScalar*,
170  const double*, const int*, const std::uint8_t*,
171  const std::uint32_t)>
172  fn);
173 
176  void set_cell_domains(const mesh::MeshTags<int>& cell_domains);
177 
180  void
181  set_exterior_facet_domains(const mesh::MeshTags<int>& exterior_facet_domains);
182 
185  void
186  set_interior_facet_domains(const mesh::MeshTags<int>& interior_facet_domains);
187 
190  void set_vertex_domains(const mesh::MeshTags<int>& vertex_domains);
191 
194 
196  const FormCoefficients& coefficients() const;
197 
199  const FormIntegrals& integrals() const;
200 
206  const std::vector<
207  std::pair<std::string, std::shared_ptr<const function::Constant>>>&
208  constants() const;
209 
210 private:
211  // Integrals associated with the Form
212  FormIntegrals _integrals;
213 
214  // Coefficients associated with the Form
215  FormCoefficients _coefficients;
216 
217  // Constants associated with the Form
218  std::vector<std::pair<std::string, std::shared_ptr<const function::Constant>>>
219  _constants;
220 
221  // Function spaces (one for each argument)
222  std::vector<std::shared_ptr<const function::FunctionSpace>> _function_spaces;
223 
224  // The mesh (needed for functionals when we don't have any spaces)
225  std::shared_ptr<const mesh::Mesh> _mesh;
226 };
227 } // namespace fem
228 } // namespace dolfinx
dolfinx::fem::Form::coefficients
FormCoefficients & coefficients()
Access coefficients.
Definition: Form.cpp:192
dolfinx::fem::Form::integrals
const FormIntegrals & integrals() const
Access form integrals.
Definition: Form.cpp:206
dolfinx::fem::Form::set_exterior_facet_domains
void set_exterior_facet_domains(const mesh::MeshTags< int > &exterior_facet_domains)
Set exterior facet domains.
Definition: Form.cpp:173
dolfinx::fem::Form::set_mesh
void set_mesh(std::shared_ptr< const mesh::Mesh > mesh)
Set mesh, necessary for functionals when there are no function spaces.
Definition: Form.cpp:138
dolfinx::fem::Form::set_coefficients
void set_coefficients(std::map< std::size_t, std::shared_ptr< const function::Function >> coefficients)
Set coefficient with given number (shared pointer version)
Definition: Form.cpp:61
dolfinx::fem::Form::set_constants
void set_constants(std::map< std::string, std::shared_ptr< const function::Constant >> constants)
Set constants based on their names.
Definition: Form.cpp:82
dolfinx::fem::Form::set_cell_domains
void set_cell_domains(const mesh::MeshTags< int > &cell_domains)
Set cell domains.
Definition: Form.cpp:168
dolfinx::fem::Form
Base class for variational forms.
Definition: Form.h:65
dolfinx::fem::Form::set_tabulate_tensor
void set_tabulate_tensor(FormIntegrals::Type type, int i, std::function< void(PetscScalar *, const PetscScalar *, const PetscScalar *, const double *, const int *, const std::uint8_t *, const std::uint32_t)> fn)
Register the function for 'tabulate_tensor' for cell integral i.
Definition: Form.cpp:156
dolfinx::mesh::MeshTags
A MeshTags are used to associate mesh entities with values. The entity index (local to process) ident...
Definition: Form.h:35
dolfinx::fem::Form::get_unset_constants
std::set< std::string > get_unset_constants() const
Return names of any constants that have not been set.
Definition: Form.cpp:127
dolfinx::fem::Form::rank
int rank() const
Rank of form (bilinear form = 2, linear form = 1, functional = 0, etc)
Definition: Form.cpp:59
dolfinx::fem::Form::set_vertex_domains
void set_vertex_domains(const mesh::MeshTags< int > &vertex_domains)
Set vertex domains.
Definition: Form.cpp:187
dolfinx::fem::FormIntegrals::Type
Type
Type of integral.
Definition: FormIntegrals.h:34
dolfinx::fem::Form::mesh
std::shared_ptr< const mesh::Mesh > mesh() const
Extract common mesh from form.
Definition: Form.cpp:145
dolfinx::fem::Form::set_interior_facet_domains
void set_interior_facet_domains(const mesh::MeshTags< int > &interior_facet_domains)
Set interior facet domains.
Definition: Form.cpp:180
dolfinx::fem::Form::constants
const std::vector< std::pair< std::string, std::shared_ptr< const function::Constant > > > & constants() const
Access constants.
Definition: Form.cpp:201
dolfinx::fem::Form::original_coefficient_position
int original_coefficient_position(int i) const
Return original coefficient position for each coefficient (0 <= i < n)
Definition: Form.cpp:77
dolfinx::fem::Form::function_space
std::shared_ptr< const function::FunctionSpace > function_space(int i) const
Return function space for given argument.
Definition: Form.cpp:151
dolfinx::fem::Form::Form
Form(const std::vector< std::shared_ptr< const function::FunctionSpace >> &function_spaces, const FormIntegrals &integrals, const FormCoefficients &coefficients, const std::vector< std::pair< std::string, std::shared_ptr< const function::Constant >>> constants)
Create form.
Definition: Form.cpp:26
dolfinx::fem::Form::~Form
virtual ~Form()=default
Destructor.
dolfinx::fem::FormIntegrals
Integrals of a Form, including those defined over cells, interior and exterior facets,...
Definition: FormIntegrals.h:30
dolfinx::fem::FormCoefficients
Storage for the coefficients of a Form consisting of Function and the Element objects they are define...
Definition: FormCoefficients.h:29
dolfinx::fem::Form::all_constants_set
bool all_constants_set() const
Check if all constants associated with the form have been set.
Definition: Form.cpp:118