Files
MeanField_SERiF/docs/latex/namespaceserif_1_1discretization_1_1forms.tex
Emily Boudreaux 6b57738330 docs(docs): built docs
Note for now much of the docs is LLM written. This was done to save time and focus on code development. The docs have been LOOSLEY reviewed. However, the code itself has been either fully written by hand or fully reviewed. Therefore, the docs should at the moment be seen as a loose resource rather than authoratiative (and this is on top of the general ability for docs to drift)
2026-11-09 14:09:44 -05:00

263 lines
27 KiB
TeX

\doxysection{serif\+::discretization\+::forms Namespace Reference}
\hypertarget{namespaceserif_1_1discretization_1_1forms}{}\label{namespaceserif_1_1discretization_1_1forms}\index{serif::discretization::forms@{serif::discretization::forms}}
\doxysubsubsection*{Classes}
\begin{DoxyCompactItemize}
\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1boundary__flux}{boundary\+\_\+flux}}
\begin{DoxyCompactList}\small\item\em The \doxylink{structserif_1_1discretization_1_1forms_1_1boundary__flux}{boundary\+\_\+flux} form represents the boundary flux operation in the discretization framework. It takes a trial term and a test term as template parameters and defines the operand types for the boundary flux operation. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1divergence}{divergence}}
\begin{DoxyCompactList}\small\item\em The divergence form represents the divergence operation in the discretization framework. It takes a trial term and a test term as template parameters and defines the operand types for the divergence operation. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1force}{force}}
\begin{DoxyCompactList}\small\item\em The force form represents the force term in the discretization framework. It takes a trial term and a test term as template parameters and defines the operand types for the force operation. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1form}{form}}
\begin{DoxyCompactList}\small\item\em The form struct is a tag type that is used to identify a form in the discretization. It is used to group together forms that belong to the same mathematical operation. Each form should have a unique name and a list of operand types that belong to it. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_form_descriptor}{Form\+Descriptor}}
\begin{DoxyCompactList}\small\item\em Runtime form descriptor including runtime term information. Used to represented the compile-\/time form type at runtime. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_form_traits}{Form\+Traits}}
\begin{DoxyCompactList}\small\item\em Compile-\/time traits for forms, used to extract types and properties from template parameters. This struct is specialized for each form type to provide specific traits such as trial and test order reductions. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_form_traits_3_01boundary__flux_3_01_trial_t_00_01_test_t_01_4_01_4}{Form\+Traits$<$ boundary\+\_\+flux$<$ Trial\+T, Test\+T $>$ $>$}}
\begin{DoxyCompactList}\small\item\em Specialization of \doxylink{structserif_1_1discretization_1_1forms_1_1_form_traits}{Form\+Traits} for the \doxylink{structserif_1_1discretization_1_1forms_1_1boundary__flux}{boundary\+\_\+flux} form, which has no order reduction for either trial or test terms. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_form_traits_3_01divergence_3_01_trial_t_00_01_test_t_01_4_01_4}{Form\+Traits$<$ divergence$<$ Trial\+T, Test\+T $>$ $>$}}
\begin{DoxyCompactList}\small\item\em Specialization of \doxylink{structserif_1_1discretization_1_1forms_1_1_form_traits}{Form\+Traits} for the divergence form, which has an order reduction of 1, to satisfy the Inf-\/\+Sup condition, for the trial term and no order reduction for the test term. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_form_traits_3_01force_3_01_trial_t_00_01_test_t_01_4_01_4}{Form\+Traits$<$ force$<$ Trial\+T, Test\+T $>$ $>$}}
\begin{DoxyCompactList}\small\item\em Specialization of \doxylink{structserif_1_1discretization_1_1forms_1_1_form_traits}{Form\+Traits} for the force form, which has no order reduction for either trial or test terms. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_form_traits_3_01mass_3_01_trial_t_00_01_test_t_01_4_01_4}{Form\+Traits$<$ mass$<$ Trial\+T, Test\+T $>$ $>$}}
\begin{DoxyCompactList}\small\item\em Specialization of \doxylink{structserif_1_1discretization_1_1forms_1_1_form_traits}{Form\+Traits} for the mass form, which has no order reduction for either trial or test terms. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_form_traits_3_01projection_3_01_trial_t_00_01_test_t_01_4_01_4}{Form\+Traits$<$ projection$<$ Trial\+T, Test\+T $>$ $>$}}
\begin{DoxyCompactList}\small\item\em Specialization of \doxylink{structserif_1_1discretization_1_1forms_1_1_form_traits}{Form\+Traits} for the projection form, which has no order reduction for either trial or test terms. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_form_traits_3_01source_3_01_trial_t_00_01_test_t_01_4_01_4}{Form\+Traits$<$ source$<$ Trial\+T, Test\+T $>$ $>$}}
\begin{DoxyCompactList}\small\item\em Specialization of \doxylink{structserif_1_1discretization_1_1forms_1_1_form_traits}{Form\+Traits} for the source form, which has no order reduction for either trial or test terms. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1mass}{mass}}
\begin{DoxyCompactList}\small\item\em The mass form represents the mass matrix operation in the discretization framework. It takes a trial term and a test term as template parameters and defines the operand types for the mass operation. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operand}{Operand}}
\begin{DoxyCompactList}\small\item\em Compile time representation of some operand. An operand associates a term to an operation type (e.\+g. the gradient of gravitational potential where gravitational potential is the term and gradient is the operation). \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operand_result}{Operand\+Result}}
\begin{DoxyCompactList}\small\item\em General case for compile time metadata associating some operand to the value type of its result. These use the \doxylink{structserif_1_1discretization_1_1forms_1_1_operation_value}{Operation\+Value} struct and the information in the operand to determine the value type of the result of that operand. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operand_result_3_01_operand_t_01_4}{Operand\+Result$<$ Operand\+T $>$}}
\begin{DoxyCompactList}\small\item\em Specialization of the \doxylink{structserif_1_1discretization_1_1forms_1_1_operand_result}{Operand\+Result} struct for operands that are valid operands (satisfy the \doxylink{conceptserif_1_1discretization_1_1forms_1_1_is_operand}{Is\+Operand} concept) and are spatial terms (e.\+g defined over the domain, think mass density). This specialization uses the \doxylink{structserif_1_1discretization_1_1forms_1_1_operation_value}{Operation\+Value} struct to determine the value type of the result of the operand based on its term type and operation type. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operation}{Operation}}
\begin{DoxyCompactList}\small\item\em The \doxylink{structserif_1_1discretization_1_1forms_1_1_operation}{Operation} struct defines a set of operations that can be applied to terms in the context of a form. These operations include value, gradient, divergence, curl, and normal trace. Similar to the statement I made at the top of \doxylink{forms_8hpp}{forms.\+hpp}, if you are a developer looking to extend the mathematical capabilities of SERiF this is a place you should be looking early on. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operation_value}{Operation\+Value}}
\begin{DoxyCompactList}\small\item\em General case for compile time metadata associating a tensor rank to an operation. The specialization of this will also specific what the return value of an operation of that rank will be. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operation_value_3_010_00_01_operation_1_1_gradient_01_4}{Operation\+Value$<$ 0, Operation\+::\+Gradient $>$}}
\begin{DoxyCompactList}\small\item\em The gradient of a rank 0 tensor is a rank 1 tensor (a vector of doubles) \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operation_value_3_010_00_01_operation_1_1_value_01_4}{Operation\+Value$<$ 0, Operation\+::\+Value $>$}}
\begin{DoxyCompactList}\small\item\em The value of a rank 0 tensor is a scalar, a double in the case of SERiF where we restrict ourselves to double precision. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operation_value_3_011_00_01_operation_1_1_curl_01_4}{Operation\+Value$<$ 1, Operation\+::\+Curl $>$}}
\begin{DoxyCompactList}\small\item\em The curl of a rank 1 tensor is a rank 1 tensor (a vector of doubles) \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operation_value_3_011_00_01_operation_1_1_divergence_01_4}{Operation\+Value$<$ 1, Operation\+::\+Divergence $>$}}
\begin{DoxyCompactList}\small\item\em The divergence of a rank one tensor is a scalar (a double) \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operation_value_3_011_00_01_operation_1_1_gradient_01_4}{Operation\+Value$<$ 1, Operation\+::\+Gradient $>$}}
\begin{DoxyCompactList}\small\item\em \doxylink{namespaceserif_ab7690da8665e9d9bd2fa8e8534cd6e57}{Vector} gradients use G\mbox{[}component\mbox{]}\mbox{[}derivative\mbox{]} = partial\+\_\+derivative(u\+\_\+component, x\+\_\+derivative). \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operation_value_3_011_00_01_operation_1_1_normal_trace_01_4}{Operation\+Value$<$ 1, Operation\+::\+Normal\+Trace $>$}}
\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operation_value_3_011_00_01_operation_1_1_value_01_4}{Operation\+Value$<$ 1, Operation\+::\+Value $>$}}
\begin{DoxyCompactList}\small\item\em The value of a rank 1 tensor is a rank 1 tensor (a vector of doubles in SERiF) \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1projection}{projection}}
\begin{DoxyCompactList}\small\item\em The projection form represents the projection operation in the discretization framework. It takes a trial term and a test term as template parameters and defines the operand types for the projection operation. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1source}{source}}
\begin{DoxyCompactList}\small\item\em The source form represents the source term in the discretization framework. It takes a trial term and a test term as template parameters and defines the operand types for the source operation. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_value_components}{Value\+Components}}
\begin{DoxyCompactList}\small\item\em Helper variable template to determine the number of components in the value type of an operand. This is a convenience variable that allows you to easily access the number of components in the value type of an operand without having to explicitly use the \doxylink{structserif_1_1discretization_1_1forms_1_1_operand_result}{Operand\+Result} struct. \end{DoxyCompactList}\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_value_components_3_01double_01_4}{Value\+Components$<$ double $>$}}
\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_value_components_3_01std_1_1array_3_01_entry_00_01_size_01_4_01_4}{Value\+Components$<$ std\+::array$<$ Entry, Size $>$ $>$}}
\item
struct \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_value_components_3_01void_01_4}{Value\+Components$<$ void $>$}}
\end{DoxyCompactItemize}
\doxysubsubsection*{Concepts}
\begin{DoxyCompactItemize}
\item
concept \mbox{\hyperlink{conceptserif_1_1discretization_1_1forms_1_1_form}{Form}}
\begin{DoxyCompactList}\small\item\em Concept for types that are forms in the discretization framework. In order satisfy this concept a type must derive from the form base class and must define a member type called operand\+\_\+types which is intended to be a type list of the trial and test terms for the form. \end{DoxyCompactList}\item
concept \mbox{\hyperlink{conceptserif_1_1discretization_1_1forms_1_1_is_operation}{Is\+Operation}}
\item
concept \mbox{\hyperlink{conceptserif_1_1discretization_1_1forms_1_1_is_operand}{Is\+Operand}}
\begin{DoxyCompactList}\small\item\em Concept to validate a valid operand. An operand is valid if the following conditions are satisfied. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsubsection*{Typedefs}
\begin{DoxyCompactItemize}
\item
using \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_a19001a41347e243892d7bfef18abd174}{Vector\+Value}} = std\+::array$<$double, 3$>$
\begin{DoxyCompactList}\small\item\em Alias for a rank 1 tensor of dimension 3 with elements doubles. \end{DoxyCompactList}\item
using \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_aecbaccd35c1209031d60ea7348d6a452}{Matrix\+Value}} = std\+::array$<$\mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_a19001a41347e243892d7bfef18abd174}{Vector\+Value}}, 3$>$
\begin{DoxyCompactList}\small\item\em Alias for a rank 2 tensor of dimension 3 with cells as doubles. \end{DoxyCompactList}\item
{\footnotesize template$<$Is\+Operand OperandT$>$ }\\using \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_ab58e222c3ef402eeceadd03fd04180bf}{Operand\+Value}} = \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operand_result}{Operand\+Result}}$<$OperandT$>$\+::type
\begin{DoxyCompactList}\small\item\em Alias for the value type of an operand. This is a convenience alias that allows you to easily access the value type of an operand without having to explicitly use the \doxylink{structserif_1_1discretization_1_1forms_1_1_operand_result}{Operand\+Result} struct. \end{DoxyCompactList}\item
{\footnotesize template$<$typename OutputT, typename InputT$>$ }\\using \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_a259c1476be2e462d8cd07c803434af69}{Partial\+Derivative}}
\begin{DoxyCompactList}\small\item\em Alias for the partial derivative of some output type with respect to some input type. This is a convenience alias that allows you to easily access the partial derivative type without having to explicitly use the \doxylink{structserif_1_1discretization_1_1forms_1_1_operand_result}{Operand\+Result} struct. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsubsection*{Functions}
\begin{DoxyCompactItemize}
\item
{\footnotesize template$<$typename ValueT$>$ }\\decltype(auto) \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_aa4daa912e2157d80dc731a6ce2349dfe}{component}} (ValueT \&value, int index)
\begin{DoxyCompactList}\small\item\em Read one entry of a scalar/vector/matrix value. This is a convenience function that allows you to easily access the components of a value type without having to explicitly use the \doxylink{structserif_1_1discretization_1_1forms_1_1_operand_result}{Operand\+Result} struct. \end{DoxyCompactList}\item
{\footnotesize template$<$typename OutputT, typename InputT$>$ }\\double \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_a2adce8ae20f5f99c4302d9446cad1ebb}{derivative\+\_\+component}} (const \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_a259c1476be2e462d8cd07c803434af69}{Partial\+Derivative}}$<$ OutputT, InputT $>$ \&value, int output, int input)
\begin{DoxyCompactList}\small\item\em Read one entry of a scalar/vector/matrix local derivative. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsubsection*{Variables}
\begin{DoxyCompactItemize}
\item
{\footnotesize template$<$Form FormT$>$ }\\constexpr \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_form_descriptor}{Form\+Descriptor}} \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_aa9c9e5345d458df1a069b05fccf45394}{form\+\_\+descriptor}}
\begin{DoxyCompactList}\small\item\em Specialization of the \doxylink{structserif_1_1discretization_1_1forms_1_1_form_descriptor}{Form\+Descriptor} class at compile time for some particular compile-\/time form. This allows us to generate constexpr instances of this struct at compile time and usable at runtime. \end{DoxyCompactList}\item
{\footnotesize template$<$typename ValueT$>$ }\\constexpr int \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_a8ff94af3602610b4765e1e1e87aebdb9}{component\+\_\+count}} = \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_value_components}{Value\+Components}}$<$std\+::remove\+\_\+cv\+\_\+t$<$ValueT$>$$>$\+::value
\end{DoxyCompactItemize}
\doxysubsection{Typedef Documentation}
\Hypertarget{namespaceserif_1_1discretization_1_1forms_aecbaccd35c1209031d60ea7348d6a452}\index{serif::discretization::forms@{serif::discretization::forms}!MatrixValue@{MatrixValue}}
\index{MatrixValue@{MatrixValue}!serif::discretization::forms@{serif::discretization::forms}}
\doxysubsubsection{\texorpdfstring{MatrixValue}{MatrixValue}}
{\footnotesize\ttfamily \label{namespaceserif_1_1discretization_1_1forms_aecbaccd35c1209031d60ea7348d6a452}
using \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_aecbaccd35c1209031d60ea7348d6a452}{serif\+::discretization\+::forms\+::\+Matrix\+Value}} = std\+::array$<$\mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_a19001a41347e243892d7bfef18abd174}{Vector\+Value}}, 3$>$}
Alias for a rank 2 tensor of dimension 3 with cells as doubles.
\Hypertarget{namespaceserif_1_1discretization_1_1forms_ab58e222c3ef402eeceadd03fd04180bf}\index{serif::discretization::forms@{serif::discretization::forms}!OperandValue@{OperandValue}}
\index{OperandValue@{OperandValue}!serif::discretization::forms@{serif::discretization::forms}}
\doxysubsubsection{\texorpdfstring{OperandValue}{OperandValue}}
{\footnotesize\ttfamily \label{namespaceserif_1_1discretization_1_1forms_ab58e222c3ef402eeceadd03fd04180bf}
template$<$Is\+Operand OperandT$>$ \\
using \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_ab58e222c3ef402eeceadd03fd04180bf}{serif\+::discretization\+::forms\+::\+Operand\+Value}} = \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_operand_result}{Operand\+Result}}$<$OperandT$>$\+::type}
Alias for the value type of an operand. This is a convenience alias that allows you to easily access the value type of an operand without having to explicitly use the \doxylink{structserif_1_1discretization_1_1forms_1_1_operand_result}{Operand\+Result} struct.
\begin{DoxyTemplParams}{Template Parameters}
{\em OperandT} & The operand type to determine the value type for. \\
\hline
\end{DoxyTemplParams}
\Hypertarget{namespaceserif_1_1discretization_1_1forms_a259c1476be2e462d8cd07c803434af69}\index{serif::discretization::forms@{serif::discretization::forms}!PartialDerivative@{PartialDerivative}}
\index{PartialDerivative@{PartialDerivative}!serif::discretization::forms@{serif::discretization::forms}}
\doxysubsubsection{\texorpdfstring{PartialDerivative}{PartialDerivative}}
{\footnotesize\ttfamily \label{namespaceserif_1_1discretization_1_1forms_a259c1476be2e462d8cd07c803434af69}
template$<$typename OutputT, typename InputT$>$ \\
using \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_a259c1476be2e462d8cd07c803434af69}{serif\+::discretization\+::forms\+::\+Partial\+Derivative}}}
{\bfseries Initial value\+:}
\begin{DoxyCode}{0}
\DoxyCodeLine{\ std::conditional\_t<std::same\_as<OutputT,\ double>,\ InputT,\ std::conditional\_t<std::same\_as<InputT,\ double>,\ OutputT,}
\DoxyCodeLine{\ \ \ \ \ \ \ \ std::array<std::array<double,\ component\_count<InputT>>,\ \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_a8ff94af3602610b4765e1e1e87aebdb9}{component\_count<OutputT>}}>>>}
\end{DoxyCode}
Alias for the partial derivative of some output type with respect to some input type. This is a convenience alias that allows you to easily access the partial derivative type without having to explicitly use the \doxylink{structserif_1_1discretization_1_1forms_1_1_operand_result}{Operand\+Result} struct.
\begin{DoxyTemplParams}{Template Parameters}
{\em OutputT} & The output type of the partial derivative. \\
\hline
{\em InputT} & The input type of the partial derivative.\\
\hline
\end{DoxyTemplParams}
\begin{DoxyRefDesc}{Todo}
\item[\mbox{\hyperlink{todo__todo000033}{Todo}}]Should probably be consolidated with the other \doxylink{namespaceserif_1_1discretization_1_1forms_a259c1476be2e462d8cd07c803434af69}{Partial\+Derivative} system... No, should {\itshape definitely} be consolidated... \end{DoxyRefDesc}
\Hypertarget{namespaceserif_1_1discretization_1_1forms_a19001a41347e243892d7bfef18abd174}\index{serif::discretization::forms@{serif::discretization::forms}!VectorValue@{VectorValue}}
\index{VectorValue@{VectorValue}!serif::discretization::forms@{serif::discretization::forms}}
\doxysubsubsection{\texorpdfstring{VectorValue}{VectorValue}}
{\footnotesize\ttfamily \label{namespaceserif_1_1discretization_1_1forms_a19001a41347e243892d7bfef18abd174}
using \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_a19001a41347e243892d7bfef18abd174}{serif\+::discretization\+::forms\+::\+Vector\+Value}} = std\+::array$<$double, 3$>$}
Alias for a rank 1 tensor of dimension 3 with elements doubles.
\begin{DoxyRefDesc}{Todo}
\item[\mbox{\hyperlink{todo__todo000031}{Todo}}]This file was a mistake, the information it is is helpful yes, however, it has lost generality, lost good type information, and does not need to be separate Really we should refactor this to be part of \doxylink{structserif_1_1discretization_1_1forms_1_1_operation}{Operation}, remove the assumption of 3 dimensionality, and probably fall back to something like a span rather than an array. \end{DoxyRefDesc}
\doxysubsection{Function Documentation}
\Hypertarget{namespaceserif_1_1discretization_1_1forms_aa4daa912e2157d80dc731a6ce2349dfe}\index{serif::discretization::forms@{serif::discretization::forms}!component@{component}}
\index{component@{component}!serif::discretization::forms@{serif::discretization::forms}}
\doxysubsubsection{\texorpdfstring{component()}{component()}}
{\footnotesize\ttfamily \label{namespaceserif_1_1discretization_1_1forms_aa4daa912e2157d80dc731a6ce2349dfe}
template$<$typename ValueT$>$ \\
decltype(auto) serif\+::discretization\+::forms\+::component (\begin{DoxyParamCaption}\item[{ValueT \&}]{value}{, }\item[{int}]{index}{}\end{DoxyParamCaption})}
Read one entry of a scalar/vector/matrix value. This is a convenience function that allows you to easily access the components of a value type without having to explicitly use the \doxylink{structserif_1_1discretization_1_1forms_1_1_operand_result}{Operand\+Result} struct.
\begin{DoxyTemplParams}{Template Parameters}
{\em ValueT} & The value type to read from. \\
\hline
\end{DoxyTemplParams}
\begin{DoxyParams}{Parameters}
{\em value} & The value to read from. \\
\hline
{\em index} & The index of the component to read. \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
The component of the value at the specified index.
\end{DoxyReturn}
\Hypertarget{namespaceserif_1_1discretization_1_1forms_a2adce8ae20f5f99c4302d9446cad1ebb}\index{serif::discretization::forms@{serif::discretization::forms}!derivative\_component@{derivative\_component}}
\index{derivative\_component@{derivative\_component}!serif::discretization::forms@{serif::discretization::forms}}
\doxysubsubsection{\texorpdfstring{derivative\_component()}{derivative\_component()}}
{\footnotesize\ttfamily \label{namespaceserif_1_1discretization_1_1forms_a2adce8ae20f5f99c4302d9446cad1ebb}
template$<$typename OutputT, typename InputT$>$ \\
double serif\+::discretization\+::forms\+::derivative\+\_\+component (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{namespaceserif_1_1discretization_1_1forms_a259c1476be2e462d8cd07c803434af69}{Partial\+Derivative}}$<$ OutputT, InputT $>$ \&}]{value}{, }\item[{int}]{output}{, }\item[{int}]{input}{}\end{DoxyParamCaption})}
Read one entry of a scalar/vector/matrix local derivative.
\begin{DoxyTemplParams}{Template Parameters}
{\em OutputT} & The output type of the partial derivative. \\
\hline
{\em InputT} & The input type of the partial derivative. \\
\hline
\end{DoxyTemplParams}
\begin{DoxyParams}{Parameters}
{\em value} & The partial derivative to read from. \\
\hline
{\em output} & The index of the output component to read. \\
\hline
{\em input} & The index of the input component to read. \\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
The component of the partial derivative at the specified indices.
\end{DoxyReturn}
\doxysubsection{Variable Documentation}
\Hypertarget{namespaceserif_1_1discretization_1_1forms_a8ff94af3602610b4765e1e1e87aebdb9}\index{serif::discretization::forms@{serif::discretization::forms}!component\_count@{component\_count}}
\index{component\_count@{component\_count}!serif::discretization::forms@{serif::discretization::forms}}
\doxysubsubsection{\texorpdfstring{component\_count}{component\_count}}
{\footnotesize\ttfamily \label{namespaceserif_1_1discretization_1_1forms_a8ff94af3602610b4765e1e1e87aebdb9}
template$<$typename ValueT$>$ \\
int serif\+::discretization\+::forms\+::component\+\_\+count = \mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_value_components}{Value\+Components}}$<$std\+::remove\+\_\+cv\+\_\+t$<$ValueT$>$$>$\+::value\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [constexpr]}}
\Hypertarget{namespaceserif_1_1discretization_1_1forms_aa9c9e5345d458df1a069b05fccf45394}\index{serif::discretization::forms@{serif::discretization::forms}!form\_descriptor@{form\_descriptor}}
\index{form\_descriptor@{form\_descriptor}!serif::discretization::forms@{serif::discretization::forms}}
\doxysubsubsection{\texorpdfstring{form\_descriptor}{form\_descriptor}}
{\footnotesize\ttfamily \label{namespaceserif_1_1discretization_1_1forms_aa9c9e5345d458df1a069b05fccf45394}
template$<$Form FormT$>$ \\
\mbox{\hyperlink{structserif_1_1discretization_1_1forms_1_1_form_descriptor}{Form\+Descriptor}} serif\+::discretization\+::forms\+::form\+\_\+descriptor\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [constexpr]}}
{\bfseries Initial value\+:}
\begin{DoxyCode}{0}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ \ \ \ \ .name\ =\ FormT::name,}
\DoxyCodeLine{\ \ \ \ \ \ \ \ .trial\ =\ \mbox{\hyperlink{namespaceserif_1_1discretization_1_1blocks_aa9f0d01c3fa0c64f62d684acf9f7ae27}{blocks::term\_descriptor<typename\ FormT::trial\_type>}},}
\DoxyCodeLine{\ \ \ \ \ \ \ \ .test\ =\ \mbox{\hyperlink{namespaceserif_1_1discretization_1_1blocks_aa9f0d01c3fa0c64f62d684acf9f7ae27}{blocks::term\_descriptor<typename\ FormT::test\_type>}}}
\DoxyCodeLine{\ \ \ \ \}}
\end{DoxyCode}
Specialization of the \doxylink{structserif_1_1discretization_1_1forms_1_1_form_descriptor}{Form\+Descriptor} class at compile time for some particular compile-\/time form. This allows us to generate constexpr instances of this struct at compile time and usable at runtime.
\begin{DoxyTemplParams}{Template Parameters}
{\em FormT} & The form to generate a descriptor for \\
\hline
\end{DoxyTemplParams}