HyperHDG
nonlinear_eigenvalue.hxx
Go to the documentation of this file.
1 #pragma once // Ensure that file is included only once in a single compilation.
2 
5 #include <HyperHDG/hy_assert.hxx>
6 #include <HyperHDG/plot.hxx>
7 #include <algorithm>
8 #include <array>
9 #include <cmath>
10 
11 namespace GlobalLoop
12 {
13 /*!*************************************************************************************************
14  * \brief Combine local solver and global information for nonlinear eigenvalue problems.
15  *
16  * \tparam TopologyT Class type containing topological information.
17  * \tparam GeometryT Class type containing geometrical information.
18  * \tparam NodeDescriptorT Class type containing the information of nodes of hyperedges.
19  * \tparam LocalSolverT Class type of the local solver.
20  * \tparam LargeVecT Clas type of large, global vector.
21  * \tparam dof_index_t Index type of hyperedges. Default is \c unsigned \c int.
22  *
23  * \authors Guido Kanschat, Heidelberg University, 2019--2020.
24  * \authors Andreas Rupp, Heidelberg University, 2019--2020.
25  **************************************************************************************************/
26 template <class TopologyT,
27  class GeometryT,
28  class NodeDescriptorT,
29  class LocalSolverT,
30  typename LargeVecT = std::vector<double>,
31  typename dof_index_t = unsigned int>
33 {
34  /*!***********************************************************************************************
35  * \brief Prepare struct to check for function to exist (cf. compile_time_tricks.hxx).
36  ************************************************************************************************/
37  HAS_MEMBER_FUNCTION(trace_to_flux, has_trace_to_flux);
38  /*!***********************************************************************************************
39  * \brief Prepare struct to check for function to exist (cf. compile_time_tricks.hxx).
40  ************************************************************************************************/
41  HAS_MEMBER_FUNCTION(jacobian_of_trace_to_flux, has_jacobian_of_trace_to_flux);
42  /*!***********************************************************************************************
43  * \brief Prepare struct to check for function to exist (cf. compile_time_tricks.hxx).
44  ************************************************************************************************/
45  HAS_MEMBER_FUNCTION(make_initial, has_make_initial);
46 
47  /*!***********************************************************************************************
48  * \brief Floating type is determined by floating type of large vector's entries.
49  ************************************************************************************************/
50  using dof_value_t = typename LargeVecT::value_type;
51 
52  private:
53  /*!***********************************************************************************************
54  * \brief Instantiation of a hypergraph.
55  ************************************************************************************************/
56  HDGHyperGraph<LocalSolverT::n_glob_dofs_per_node(),
57  TopologyT,
58  GeometryT,
59  NodeDescriptorT,
60  typename LocalSolverT::data_type>
62  /*!***********************************************************************************************
63  * \brief Instantiation of a local solver.
64  ************************************************************************************************/
65  const LocalSolverT local_solver_;
66  /*!***********************************************************************************************
67  * \brief Struct encoding the options for plotting.
68  ************************************************************************************************/
70 
71  public:
72  /*!***********************************************************************************************
73  * \brief Abstract problem constructor.
74  *
75  * Constructor for class containing a HyperGraph and a local solver that solve a PDE on a
76  * hyperedge.
77  *
78  * \param construct_topo Information to construct a topology.
79  * \param construct_geom Information to construct a geometry.
80  * \param construct_loc_sol Information to construct a local solver.
81  ************************************************************************************************/
82  NonlinearEigenvalue(const typename TopologyT::constructor_value_type& construct_topo,
83  const typename GeometryT::constructor_value_type& construct_geom,
84  const typename LocalSolverT::constructor_value_type& construct_loc_sol)
85  : hyper_graph_(construct_topo, construct_geom), local_solver_(construct_loc_sol)
86  {
87  static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
88  "Hyperedge dimension of topology and geometry must be equal!");
89  static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
90  "Space dimension of topology and geometry must be equal!");
91  static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
92  "Hyperedge dimension of hypergraph and local solver must be equal!");
93  }
94  /*!***********************************************************************************************
95  * \brief Abstract problem constructor.
96  *
97  * Constructor for class containing a HyperGraph and a local solver that solve a PDE on a
98  * hyperedge.
99  *
100  * \param construct_topo Information to construct a topology.
101  * \param construct_loc_sol Information to construct a local solver.
102  ************************************************************************************************/
103  NonlinearEigenvalue(const typename TopologyT::constructor_value_type& construct_topo,
104  const typename LocalSolverT::constructor_value_type& construct_loc_sol)
105  : hyper_graph_(construct_topo), local_solver_(construct_loc_sol)
106  {
107  static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
108  "Hyperedge dimension of topology and geometry must be equal!");
109  static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
110  "Space dimension of topology and geometry must be equal!");
111  static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
112  "Hyperedge dimension of hypergraph and local solver must be equal!");
113  }
114  /*!***********************************************************************************************
115  * \brief Abstract problem constructor.
116  *
117  * Constructor for class containing a HyperGraph and a local solver that solve a PDE on a
118  * hyperedge.
119  *
120  * \param construct_topo Information to construct a topology.
121  ************************************************************************************************/
122  NonlinearEigenvalue(const typename TopologyT::constructor_value_type& construct_topo)
123  : hyper_graph_(construct_topo)
124  {
125  static_assert(TopologyT::hyEdge_dim() == GeometryT::hyEdge_dim(),
126  "Hyperedge dimension of topology and geometry must be equal!");
127  static_assert(TopologyT::space_dim() == GeometryT::space_dim(),
128  "Space dimension of topology and geometry must be equal!");
129  static_assert(TopologyT::hyEdge_dim() == LocalSolverT::hyEdge_dim(),
130  "Hyperedge dimension of hypergraph and local solver must be equal!");
131  }
132  /*!***********************************************************************************************
133  * \brief Evaluate condensed matrix-vector product.
134  *
135  * This function corresponds to the evaluation of the residual. Here, the vector contains the
136  * eigenfunction representation, while the floating point is the eigenvalue.
137  *
138  * \param x_vec A vector containing the input vector.
139  * \param eig Eigenvalue.
140  * \retval y_vec A vector containing the residual.
141  ************************************************************************************************/
142  template <typename hyNode_index_t = dof_index_t>
143  LargeVecT trace_to_flux(const LargeVecT& x_vec, const dof_value_t eig = 0.)
144  {
145  constexpr unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
146  constexpr unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
147 
148  LargeVecT vec_Ax(x_vec.size(), 0.);
150  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs_old,
151  hyEdge_dofs_new;
152 
153  // Do matrix--vector multiplication by iterating over all hyperedges.
154  std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](auto hyper_edge) {
155  // Fill x_vec's degrees of freedom of a hyperedge into hyEdge_dofs array.
156  hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
157  for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
158  {
159  hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
160  hyEdge_dofs_old[hyNode]);
161  hyEdge_dofs_new[hyNode].fill(0.);
162  }
163 
164  // Turn degrees of freedom of x_vec that have been stored locally into those of vec_Ax.
165  if constexpr (
166  has_trace_to_flux<
167  LocalSolverT,
168  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
169  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
170  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
171  dof_value_t)>::value)
172  local_solver_.trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, eig);
173  else if constexpr (
174  has_trace_to_flux<
175  LocalSolverT,
176  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
177  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
178  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
179  decltype(hyper_edge)&, dof_value_t)>::value)
180  local_solver_.trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, hyper_edge, eig);
181  else
182  hy_assert(false, "Function seems not to be implemented!");
183 
184  // Fill hyEdge_dofs array degrees of freedom into vec_Ax.
185  for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
186  hyper_graph_.hyNode_factory().add_to_dof_values(hyEdge_hyNodes[hyNode], vec_Ax,
187  hyEdge_dofs_new[hyNode]);
188  });
189 
190  return vec_Ax;
191  }
192  /*!***********************************************************************************************
193  * \brief Evaluate condensed matrix-vector product.
194  *
195  * This function corresponds to evaluating the Jacobian at point \c x_val, \c eig_val in direction
196  * \c x_vec, \c eig.
197  *
198  * \param x_vec Direction in which Jacobian is evaluated.
199  * \param eig Direction in which Jacobian is evaluated.
200  * \param x_val Point at which Jacobian is evaluated.
201  * \param eig_val Point at which Jacobian is evaluated.
202  * \retval y_vec Corresponds to directional derivative.
203  ************************************************************************************************/
204  template <typename hyNode_index_t = dof_index_t>
205  LargeVecT jacobian_of_trace_to_flux(const LargeVecT& x_vec,
206  const dof_value_t eig,
207  const LargeVecT& x_val,
208  const dof_value_t eig_val)
209  {
210  constexpr unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
211  constexpr unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
212 
213  LargeVecT vec_Ax(x_vec.size(), 0.);
215  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs_old,
216  hyEdge_dofs_new, hyEdge_vals;
217 
218  // Do matrix--vector multiplication by iterating over all hyperedges.
219  std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](auto hyper_edge) {
220  // Fill x_vec's degrees of freedom of a hyperedge into hyEdge_dofs array.
221  hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
222  for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
223  {
224  hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
225  hyEdge_dofs_old[hyNode]);
226  hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_val,
227  hyEdge_vals[hyNode]);
228  hyEdge_dofs_new[hyNode].fill(0.);
229  }
230 
231  // Turn degrees of freedom of x_vec that have been stored locally into those of vec_Ax.
232  if constexpr (
233  has_jacobian_of_trace_to_flux<
234  LocalSolverT,
235  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
236  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
237  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
238  dof_value_t,
239  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
240  dof_value_t)>::value)
241  {
242  local_solver_.jacobian_of_trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, eig, hyEdge_vals,
243  eig_val);
244  }
245  else if constexpr (
246  has_jacobian_of_trace_to_flux<
247  LocalSolverT,
248  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&(
249  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
250  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
251  dof_value_t,
252  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * TopologyT::hyEdge_dim()>&,
253  dof_value_t, decltype(hyper_edge)&)>::value)
254  {
255  local_solver_.jacobian_of_trace_to_flux(hyEdge_dofs_old, hyEdge_dofs_new, eig, hyEdge_vals,
256  eig_val, hyper_edge);
257  }
258  else
259  hy_assert(false, "Function seems not to be implemented!");
260 
261  // Fill hyEdge_dofs array degrees of freedom into vec_Ax.
262  for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
263  hyper_graph_.hyNode_factory().add_to_dof_values(hyEdge_hyNodes[hyNode], vec_Ax,
264  hyEdge_dofs_new[hyNode]);
265  });
266 
267  return vec_Ax;
268  }
269  /*!***********************************************************************************************
270  * \brief Create initial starting value for Newton's methods.
271  *
272  * \param x_vec A vector containing the input vector \f$x\f$ which should be zero.
273  * \param eig Eigenvalue (approximation).
274  * \retval y_vec A vector containing initial flux vector.
275  ************************************************************************************************/
276  template <typename hyNode_index_t = dof_index_t>
277  LargeVecT make_initial(const LargeVecT& x_vec, const dof_value_t eig = 0.)
278  {
279  constexpr unsigned int hyEdge_dim = TopologyT::hyEdge_dim();
280  constexpr unsigned int n_dofs_per_node = LocalSolverT::n_glob_dofs_per_node();
281 
282  LargeVecT vec_Ax(x_vec.size(), 0.);
284  std::array<std::array<dof_value_t, n_dofs_per_node>, 2 * hyEdge_dim> hyEdge_dofs;
285 
286  // Do matrix--vector multiplication by iterating over all hyperedges.
287  std::for_each(hyper_graph_.begin(), hyper_graph_.end(), [&](auto hyper_edge) {
288  // Fill x_vec's degrees of freedom of a hyperedge into hyEdge_dofs array.
289  hyEdge_hyNodes = hyper_edge.topology.get_hyNode_indices();
290  for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
291  hyper_graph_.hyNode_factory().get_dof_values(hyEdge_hyNodes[hyNode], x_vec,
292  hyEdge_dofs[hyNode]);
293 
294  // Turn degrees of freedom of x_vec that have been stored locally into those of vec_Ax.
295  if constexpr (has_make_initial<LocalSolverT,
296  std::array<std::array<dof_value_t, n_dofs_per_node>,
297  2 * TopologyT::hyEdge_dim()>&(
298  std::array<std::array<dof_value_t, n_dofs_per_node>,
299  2 * TopologyT::hyEdge_dim()>&,
300  dof_value_t)>::value)
301  {
302  local_solver_.make_initial(hyEdge_dofs, eig);
303  }
304  else if constexpr (has_make_initial<LocalSolverT,
305  std::array<std::array<dof_value_t, n_dofs_per_node>,
306  2 * TopologyT::hyEdge_dim()>&(
307  std::array<std::array<dof_value_t, n_dofs_per_node>,
308  2 * TopologyT::hyEdge_dim()>&,
309  decltype(hyper_edge)&, dof_value_t)>::value)
310  {
311  local_solver_.make_initial(hyEdge_dofs, hyper_edge, eig);
312  }
313  else
314  hy_assert(false, "Function seems not to be implemented!");
315 
316  // Fill hyEdge_dofs array degrees of freedom into vec_Ax.
317  for (unsigned int hyNode = 0; hyNode < hyEdge_hyNodes.size(); ++hyNode)
318  hyper_graph_.hyNode_factory().set_dof_values(hyEdge_hyNodes[hyNode], vec_Ax,
319  hyEdge_dofs[hyNode]);
320  });
321 
322  return vec_Ax;
323  }
324  /*!***********************************************************************************************
325  * \brief Determine size of condensed system for the skeletal unknowns.
326  *
327  * Function that returns the size \f$n\f$ of the \f$n \times n\f$ linear, sparse system
328  * \f$Ax = b\f$ that is solved by the program in a matrix-free fashion.
329  *
330  * This function is needed to define a \c LinearOperator from Python's \c scipy.sparse.linalg
331  * package which can be used to define iterative solvers for sparse systems.
332  *
333  * \retval n An \c int which Python needs and actually is a parsed \c unsigned
334  * \c int.
335  ************************************************************************************************/
336  dof_index_t size_of_system() const { return hyper_graph_.n_global_dofs(); }
337  /*!***********************************************************************************************
338  * \brief Set plot option and return old plot option.
339  *
340  * Function to set and / or read the current plot option.
341  *
342  * \param option A \c std::string containing the plot option to be considered.
343  * \param value A \c std::string containing the new value of the considered option.
344  * If empty, the old value is kept.
345  * \retval opt_value A \c std::string containing the value of the plot option.
346  ************************************************************************************************/
347  std::string plot_option(const std::string& option, std::string value = "")
348  {
349  return set_plot_option(plot_options, option, value);
350  }
351  /*!***********************************************************************************************
352  * \brief Plot solution in vtu format.
353  *
354  * Function that plots the solution of the problem to a predefined file.
355  *
356  * \param lambda A vector of unknowns containing the data vector.
357  * \param time Time.
358  * \retval file A file in the output directory.
359  ************************************************************************************************/
360  void plot_solution(const std::vector<dof_value_t>& lambda, const dof_value_t time = 0.)
361  {
362  plot(hyper_graph_, local_solver_, lambda, plot_options, time);
363  }
364  /*!***********************************************************************************************
365  * \brief Return refinement level.
366  ************************************************************************************************/
367  unsigned int get_refinement() { return hyper_graph_.get_refinement(); }
368  /*!***********************************************************************************************
369  * \brief Set refinement level.
370  ************************************************************************************************/
371  void set_refinement(unsigned int level) { hyper_graph_.set_refinement(level); }
372 }; // end of class NonlinearEigenvalue
373 
374 } // end of namespace GlobalLoop
compile_time_tricks.hxx
hy_assert.hxx
This file provides the function hy_assert.
plot.hxx
GlobalLoop::NonlinearEigenvalue::set_refinement
void set_refinement(unsigned int level)
Set refinement level.
Definition: nonlinear_eigenvalue.hxx:371
GlobalLoop::NonlinearEigenvalue::jacobian_of_trace_to_flux
LargeVecT jacobian_of_trace_to_flux(const LargeVecT &x_vec, const dof_value_t eig, const LargeVecT &x_val, const dof_value_t eig_val)
Evaluate condensed matrix-vector product.
Definition: nonlinear_eigenvalue.hxx:205
PlotOptions
A class storing options for plotting.
Definition: plot.hxx:20
GlobalLoop::NonlinearEigenvalue::plot_option
std::string plot_option(const std::string &option, std::string value="")
Set plot option and return old plot option.
Definition: nonlinear_eigenvalue.hxx:347
GlobalLoop::NonlinearEigenvalue::trace_to_flux
LargeVecT trace_to_flux(const LargeVecT &x_vec, const dof_value_t eig=0.)
Evaluate condensed matrix-vector product.
Definition: nonlinear_eigenvalue.hxx:143
HDGHyperGraph::end
HDGHyperGraph< n_dofs_per_nodeT, TopoT, GeomT, NodeT, DataT, hyEdge_index_t >::iterator end()
Return iterator to the end of hyEdge list.
Definition: hdg_hypergraph.hxx:433
HDGHyperGraph
The class template uniting topology and geometry of a hypergraph with the topology of the skeleton sp...
Definition: hdg_hypergraph.hxx:51
GlobalLoop::NonlinearEigenvalue::make_initial
LargeVecT make_initial(const LargeVecT &x_vec, const dof_value_t eig=0.)
Create initial starting value for Newton's methods.
Definition: nonlinear_eigenvalue.hxx:277
GlobalLoop::NonlinearEigenvalue::get_refinement
unsigned int get_refinement()
Return refinement level.
Definition: nonlinear_eigenvalue.hxx:367
GlobalLoop::NonlinearEigenvalue::NonlinearEigenvalue
NonlinearEigenvalue(const typename TopologyT::constructor_value_type &construct_topo)
Abstract problem constructor.
Definition: nonlinear_eigenvalue.hxx:122
GlobalLoop::NonlinearEigenvalue::dof_value_t
typename LargeVecT::value_type dof_value_t
Floating type is determined by floating type of large vector's entries.
Definition: nonlinear_eigenvalue.hxx:50
SmallMat::size
static constexpr unsigned int size()
Return size a SmallMat.
Definition: dense_la.hxx:54
GlobalLoop::NonlinearEigenvalue::plot_solution
void plot_solution(const std::vector< dof_value_t > &lambda, const dof_value_t time=0.)
Plot solution in vtu format.
Definition: nonlinear_eigenvalue.hxx:360
GlobalLoop::NonlinearEigenvalue::NonlinearEigenvalue
NonlinearEigenvalue(const typename TopologyT::constructor_value_type &construct_topo, const typename GeometryT::constructor_value_type &construct_geom, const typename LocalSolverT::constructor_value_type &construct_loc_sol)
Abstract problem constructor.
Definition: nonlinear_eigenvalue.hxx:82
HyperNodeFactory::add_to_dof_values
LargeVecT & add_to_dof_values(const hyNode_index_t hyNode_index, LargeVecT &global_dof_vector, const SmallVecT &local_dof_vector) const
Add different values to values of degrees of freedom related to a hypernode.
Definition: hypernodefactory.hxx:187
GlobalLoop::NonlinearEigenvalue::HAS_MEMBER_FUNCTION
HAS_MEMBER_FUNCTION(trace_to_flux, has_trace_to_flux)
Prepare struct to check for function to exist (cf. compile_time_tricks.hxx).
GlobalLoop::NonlinearEigenvalue
Combine local solver and global information for nonlinear eigenvalue problems.
Definition: nonlinear_eigenvalue.hxx:32
GlobalLoop::NonlinearEigenvalue::local_solver_
const LocalSolverT local_solver_
Instantiation of a local solver.
Definition: nonlinear_eigenvalue.hxx:65
GlobalLoop::NonlinearEigenvalue::size_of_system
dof_index_t size_of_system() const
Determine size of condensed system for the skeletal unknowns.
Definition: nonlinear_eigenvalue.hxx:336
GlobalLoop::NonlinearEigenvalue::hyper_graph_
HDGHyperGraph< LocalSolverT::n_glob_dofs_per_node(), TopologyT, GeometryT, NodeDescriptorT, typename LocalSolverT::data_type > hyper_graph_
Instantiation of a hypergraph.
Definition: nonlinear_eigenvalue.hxx:61
plot
void plot(HyperGraphT &hyper_graph, const LocalSolverT &local_solver, const LargeVecT &lambda, PlotOptions &plot_options, const floatT time=0.)
Function plotting the solution of an equation on a hypergraph in vtu format.
Definition: plot.hxx:778
hy_assert
#define hy_assert(Expr, Msg)
The assertion to be used within HyperHDG — deactivate using -DNDEBUG compile flag.
Definition: hy_assert.hxx:38
HDGHyperGraph::begin
HDGHyperGraph< n_dofs_per_nodeT, TopoT, GeomT, NodeT, DataT, hyEdge_index_t >::iterator begin()
Return iterator to first hyEdge of HDGHyperGraph.
Definition: hdg_hypergraph.hxx:417
HDGHyperGraph::hyNode_factory
const HyperNodeFactory< n_dofs_per_nodeT, hyEdge_index_t > & hyNode_factory() const
Return const reference to HyperNodeFactory.
Definition: hdg_hypergraph.hxx:446
GlobalLoop::NonlinearEigenvalue::NonlinearEigenvalue
NonlinearEigenvalue(const typename TopologyT::constructor_value_type &construct_topo, const typename LocalSolverT::constructor_value_type &construct_loc_sol)
Abstract problem constructor.
Definition: nonlinear_eigenvalue.hxx:103
set_plot_option
std::string set_plot_option(PlotOptions &plot_options, const std::string &option, std::string value="")
Set a plot option and return the new value of this option as std::string.
Definition: plot.hxx:122
hdg_hypergraph.hxx
GlobalLoop
A namespace for global loops.
Definition: elliptic.hxx:14
GlobalLoop::NonlinearEigenvalue::plot_options
PlotOptions plot_options
Struct encoding the options for plotting.
Definition: nonlinear_eigenvalue.hxx:69
SmallMat
This class implements a small/dense matrix.
Definition: dense_la.hxx:34