https://mooseframework.inl.gov
SubChannel1PhaseProblem.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
12 #include "ExternalProblem.h"
13 #include "PostprocessorInterface.h"
14 #include "SubChannelApp.h"
15 #include "QuadSubChannelMesh.h"
16 #include "SolutionHandle.h"
17 #include <petscdm.h>
18 #include <petscdmda.h>
19 #include <petscksp.h>
20 #include <petscsys.h>
21 #include <petscvec.h>
22 #include <petscsnes.h>
23 #include <limits>
24 
27 class SCMHTCClosureBase;
29 
34 {
35 public:
37  virtual ~SubChannel1PhaseProblem();
38 
39  virtual void externalSolve() override;
40  virtual void syncSolutions(Direction direction) override;
41  virtual bool solverSystemConverged(const unsigned int) override;
42  virtual void initialSetup() override;
43 
45  const SCMHTCClosureBase * getPinHTCClosure() const { return _pin_HTC_closure; } // optional
47 
50  {
51  unsigned int i_ch = 0;
52  Real Re = 1.0;
53  Real S = 0.0;
54  Real w_perim = 0.0;
55 
56  FrictionStruct() = delete;
57  FrictionStruct(unsigned int i_ch_, Real Re_, Real S_, Real w_perim_)
58  : i_ch(i_ch_), Re(Re_), S(S_), w_perim(w_perim_)
59  {
60  }
62 
65  {
66  Real Re = 1.0;
67  Real Pr = 1.0;
68  unsigned int i_pin = std::numeric_limits<unsigned int>::max(); // sentinel (duct) default
69  unsigned int iz = 0;
70  unsigned int i_ch = 0;
71 
72  NusseltStruct() = delete;
73  NusseltStruct(Real Re_, Real Pr_, unsigned int i_pin_, unsigned int iz_, unsigned int i_ch_)
74  : Re(Re_), Pr(Pr_), i_pin(i_pin_), iz(iz_), i_ch(i_ch_)
75  {
76  }
77  } _nusselt_args;
78 
80  Real getAddedHeatPin(unsigned int i_ch, unsigned int iz) const
81  {
82  return computeAddedHeatPin(i_ch, iz);
83  }
84 
86  Real getAddedHeatDuct(unsigned int i_ch, unsigned int iz) const
87  {
88  return computeAddedHeatDuct(i_ch, iz);
89  }
90 
93 
95  const PostprocessorValue & getOutletPressure() const { return _P_out; }
96 
99 
102 
103 protected:
105  virtual Real computeAddedHeatPin(unsigned int i_ch, unsigned int iz) const = 0;
106 
108  virtual Real computeAddedHeatDuct(unsigned int i_ch, unsigned int iz) const;
109 
111  void computeWijFromSolve(int iblock);
113  void computeSumWij(int iblock);
115  void computeMdot(int iblock);
117  void computeWijPrime(int iblock);
119  Real computeMixingParameter(unsigned int i_gap, unsigned int iz) const;
121  Real computeSweepFlowMixingParameter(unsigned int i_gap, unsigned int iz) const;
123  void computeDP(int iblock);
125  void computeP(int iblock);
127  virtual void computeh(int iblock) = 0;
129  void computeT(int iblock);
131  void computeRho(int iblock);
133  void computeMu(int iblock);
135  void computeWijResidual(int iblock);
137  virtual Real getSubChannelPeripheralDuctWidth(unsigned int i_ch) const = 0;
141  PetscErrorCode petscSnesSolver(int iblock,
142  const libMesh::DenseVector<Real> & solution,
145  friend PetscErrorCode formFunction(SNES snes, Vec x, Vec f, void * ctx);
146 
148  PetscErrorCode implicitPetscSolve(int iblock);
149 
151  virtual void initializeSolution() = 0;
153  void detectDeformation();
154 
156  PetscScalar computeInterpolationCoefficients(PetscScalar Peclet = 0.0);
157  PetscScalar
158  computeInterpolatedValue(PetscScalar topValue, PetscScalar botValue, PetscScalar Peclet = 0.0);
159 
161  Real computeGravityDir(const MooseEnum & dir) const
162  {
163  switch (dir)
164  {
165  case 0: // counter_flow
166  return 1.0;
167  case 1: // co_flow
168  return -1.0;
169  case 2: // none
170  return 0.0;
171  default:
172  mooseError(name(), ": Invalid gravity direction: expected counter_flow, co_flow, or none");
173  }
174  }
175 
189  PetscErrorCode solveAndPopulateEnthalpy(
190  Mat A, Vec rhs, unsigned int first_node, unsigned int last_node, const char * ksp_prefix);
191 
192  PetscErrorCode cleanUp();
195  unsigned int _n_blocks;
201  const Real _g_grav;
202  const Real & _kij;
203  unsigned int _n_cells;
204  unsigned int _n_gaps;
205  unsigned int _n_pins;
206  unsigned int _n_channels;
207  unsigned int _block_size;
209  std::vector<Real> _z_grid;
214  const bool _compute_density;
216  const bool _compute_viscosity;
218  const bool _compute_power;
220  const bool _pin_mesh_exist;
222  const bool _duct_mesh_exist;
232  const Real & _P_tol;
234  const Real & _T_tol;
236  const int & _T_maxit;
238  const PetscReal & _rtol;
240  const PetscReal & _atol;
242  const PetscReal & _dtol;
244  const PetscInt & _maxit;
251  const bool _implicit_bool;
255  const bool _segregated_bool;
259  bool _deformation = false;
267 
269  std::unique_ptr<SolutionHandle> _mdot_soln;
270  std::unique_ptr<SolutionHandle> _SumWij_soln;
271  std::unique_ptr<SolutionHandle> _P_soln;
272  std::unique_ptr<SolutionHandle> _DP_soln;
273  std::unique_ptr<SolutionHandle> _h_soln;
274  std::unique_ptr<SolutionHandle> _T_soln;
275  std::unique_ptr<SolutionHandle> _Tpin_soln;
276  std::unique_ptr<SolutionHandle> _Dpin_soln;
277  std::unique_ptr<SolutionHandle> _rho_soln;
278  std::unique_ptr<SolutionHandle> _mu_soln;
279  std::unique_ptr<SolutionHandle> _S_flow_soln;
280  std::unique_ptr<SolutionHandle> _w_perim_soln;
281  std::unique_ptr<SolutionHandle> _q_prime_soln;
282  std::unique_ptr<SolutionHandle> _duct_heat_flux_soln; // Only used for ducted assemblies
283  std::unique_ptr<SolutionHandle> _Tduct_soln; // Only used for ducted assemblies
284  std::unique_ptr<SolutionHandle> _displacement_soln;
285  std::unique_ptr<SolutionHandle> _ff_soln;
286  std::unique_ptr<SolutionHandle> _HTC_soln;
287 
289  inline PetscErrorCode createPetscVector(Vec & v, PetscInt n)
290  {
292  LibmeshPetscCall(VecCreate(PETSC_COMM_SELF, &v));
293  LibmeshPetscCall(PetscObjectSetName((PetscObject)v, "Solution"));
294  LibmeshPetscCall(VecSetSizes(v, PETSC_DECIDE, n));
295  LibmeshPetscCall(VecSetFromOptions(v));
296  LibmeshPetscCall(VecZeroEntries(v));
297  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
298  }
299 
300  inline PetscErrorCode createPetscMatrix(Mat & M, PetscInt n, PetscInt m)
301  {
303  LibmeshPetscCall(MatCreate(PETSC_COMM_SELF, &M));
304  LibmeshPetscCall(MatSetSizes(M, PETSC_DECIDE, PETSC_DECIDE, n, m));
305  LibmeshPetscCall(MatSetFromOptions(M));
306  LibmeshPetscCall(MatSetUp(M));
307  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
308  }
309 
310  template <class T>
311  PetscErrorCode populateVectorFromDense(Vec & x,
312  const T & solution,
313  const unsigned int first_axial_level,
314  const unsigned int last_axial_level,
315  const unsigned int cross_dimension);
316  template <class T>
317  PetscErrorCode populateDenseFromVector(const Vec & x,
318  T & solution,
319  const unsigned int first_axial_level,
320  const unsigned int last_axial_level,
321  const unsigned int cross_dimension);
322  template <class T>
323  PetscErrorCode populateVectorFromHandle(Vec & x,
324  const T & solution,
325  const unsigned int first_axial_level,
326  const unsigned int last_axial_level,
327  const unsigned int cross_dimension);
328  template <class T>
329  PetscErrorCode populateSolutionChan(const Vec & x,
330  T & solution,
331  const unsigned int first_axial_level,
332  const unsigned int last_axial_level,
333  const unsigned int cross_dimension);
334 
339  Vec _Wij_vec;
340  Vec _prod;
341  Vec _prodp;
347 
373 
390 
406 
408  PetscScalar _added_K = 0.0;
409  PetscScalar _added_K_old = 1000.0;
410  PetscScalar _max_sumWij;
411  PetscScalar _max_sumWij_new;
412  PetscScalar _correction_factor = 1.0;
413 
414 public:
415  static InputParameters validParams();
416 };
417 
418 template <class T>
419 PetscErrorCode
421  T & loc_solution,
422  const unsigned int first_axial_level,
423  const unsigned int last_axial_level,
424  const unsigned int cross_dimension)
425 {
426  PetscScalar * xx;
427 
429  LibmeshPetscCall(VecGetArray(x, &xx));
430  for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
431  {
432  unsigned int iz_ind = iz - first_axial_level;
433  for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
434  {
435  loc_solution(i_l, iz) = xx[iz_ind * cross_dimension + i_l];
436  }
437  }
438  LibmeshPetscCall(VecRestoreArray(x, &xx));
439 
440  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
441 }
442 
443 template <class T>
444 PetscErrorCode
446  const T & loc_solution,
447  const unsigned int first_axial_level,
448  const unsigned int last_axial_level,
449  const unsigned int cross_dimension)
450 {
451  PetscScalar * xx;
452 
454  LibmeshPetscCall(VecGetArray(x, &xx));
455  for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
456  {
457  unsigned int iz_ind = iz - first_axial_level;
458  for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
459  {
460  auto * loc_node = _subchannel_mesh.getChannelNode(i_l, iz);
461  xx[iz_ind * cross_dimension + i_l] = loc_solution(loc_node);
462  }
463  }
464  LibmeshPetscCall(VecRestoreArray(x, &xx));
465 
466  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
467 }
468 
469 template <class T>
470 PetscErrorCode
472  const T & loc_solution,
473  const unsigned int first_axial_level,
474  const unsigned int last_axial_level,
475  const unsigned int cross_dimension)
476 {
477  PetscScalar * xx;
479  LibmeshPetscCall(VecGetArray(x, &xx));
480  for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
481  {
482  unsigned int iz_ind = iz - first_axial_level;
483  for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
484  {
485  xx[iz_ind * cross_dimension + i_l] = loc_solution(i_l, iz);
486  }
487  }
488  LibmeshPetscCall(VecRestoreArray(x, &xx));
489  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
490 }
491 
492 template <class T>
493 PetscErrorCode
495  T & loc_solution,
496  const unsigned int first_axial_level,
497  const unsigned int last_axial_level,
498  const unsigned int cross_dimension)
499 {
500  PetscScalar * xx;
502  LibmeshPetscCall(VecGetArray(x, &xx));
503  Node * loc_node;
504  for (unsigned int iz = first_axial_level; iz < last_axial_level + 1; iz++)
505  {
506  unsigned int iz_ind = iz - first_axial_level;
507  for (unsigned int i_l = 0; i_l < cross_dimension; i_l++)
508  {
509  loc_node = _subchannel_mesh.getChannelNode(i_l, iz);
510  loc_solution.set(loc_node, xx[iz_ind * cross_dimension + i_l]);
511  }
512  }
513  PetscFunctionReturn(LIBMESH_PETSC_SUCCESS);
514 }
PetscErrorCode solveAndPopulateEnthalpy(Mat A, Vec rhs, unsigned int first_node, unsigned int last_node, const char *ksp_prefix)
Solve a linear system (A * x = rhs) with a simple PCJACOBI KSP and populate the enthalpy solution int...
Mat _amc_sys_mdot_mat
Axial momentum system matrix.
Base class for friction closures used in SCM.
const double M
const bool _pin_mesh_exist
Flag that informs if there is a pin mesh or not.
void computeRho(int iblock)
Computes Density per channel for block iblock.
Vec _amc_gravity_rhs
Axial momentum conservation - buoyancy force No implicit matrix.
std::unique_ptr< SolutionHandle > _Tduct_soln
std::unique_ptr< SolutionHandle > _duct_heat_flux_soln
void computeSumWij(int iblock)
Computes net diversion crossflow per channel for block iblock.
unsigned int _n_blocks
number of axial blocks
const bool _compute_power
Flag that informs if we need to solve the Enthalpy/Temperature equations or not.
std::unique_ptr< SolutionHandle > _T_soln
std::unique_ptr< SolutionHandle > _h_soln
const PetscReal & _dtol
The divergence tolerance for the ksp linear solver.
const double T
const MooseEnum _gravity_direction
The direction of gravity.
Mat _cmc_friction_force_mat
Cross momentum conservation - friction force.
void computeP(int iblock)
Computes Pressure per channel for block iblock.
Real _TR
Flag that activates or deactivates the transient parts of the equations we solve by multiplication...
libMesh::DenseMatrix< Real > _Wij_old
libMesh::DenseMatrix< Real > _DP
Real getAddedHeatPin(unsigned int i_ch, unsigned int iz) const
Return the added heat coming from the fuel pins.
const PostprocessorValue & _P_out
Outlet pressure postprocessor value.
FrictionStruct(unsigned int i_ch_, Real Re_, Real S_, Real w_perim_)
void computeT(int iblock)
Computes Temperature per channel for block iblock.
void computeMdot(int iblock)
Computes mass flow per channel for block iblock.
std::unique_ptr< SolutionHandle > _S_flow_soln
Base class for turbulent mixing closures used in SCM.
const SCMHTCClosureBase * _pin_HTC_closure
HTC closure objects.
const bool _compute_density
Flag that activates or deactivates the calculation of density.
PetscErrorCode populateSolutionChan(const Vec &x, T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
Mat _amc_friction_force_mat
Axial momentum conservation - friction force.
const SinglePhaseFluidProperties * getSinglePhaseFluidProperties() const
Get fluid properties object.
PetscScalar _added_K
Added resistances for monolithic convergence.
PetscErrorCode createPetscVector(Vec &v, PetscInt n)
Petsc Functions.
const SCMMixingClosureBase * _mixing_closure
Turbulent Mixing closure object.
PetscFunctionBegin
const double v
const bool _duct_mesh_exist
Flag that informs if there is a duct mesh or not.
static InputParameters validParams()
const Real & _T_tol
Convergence tolerance for the temperature loop in internal solve.
void computeMu(int iblock)
Computes Viscosity per channel for block iblock.
structure with the needed information to compute the friction factor at a specific subchannel cell ...
PetscScalar computeInterpolatedValue(PetscScalar topValue, PetscScalar botValue, PetscScalar Peclet=0.0)
const bool _segregated_bool
Segregated solve.
Mat _cmc_sys_Wij_mat
Lateral momentum system matrix.
bool _converged
Variable that informs whether we exited external solve with a converged solution or not...
const bool _staggered_pressure_bool
Flag to define the usage of staggered or collocated pressure.
virtual void initializeSolution()=0
Function to initialize the solution & geometry fields.
Mat _mc_sumWij_mat
Matrices and vectors to be used in implicit assembly Mass conservation Mass conservation - sum of cro...
PetscErrorCode populateVectorFromDense(Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
const SCMHTCClosureBase * _duct_HTC_closure
Real computeMixingParameter(unsigned int i_gap, unsigned int iz) const
Computes and validates the turbulent mixing parameter.
Real getAddedHeatDuct(unsigned int i_ch, unsigned int iz) const
Return the added heat coming from the duct.
virtual void computeh(int iblock)=0
Computes Enthalpy per channel for block iblock.
std::unique_ptr< SolutionHandle > _rho_soln
Mat _amc_turbulent_cross_flows_mat
Mass conservation - density time derivative No implicit matrix.
PetscErrorCode populateVectorFromHandle(Vec &x, const T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
Mat _amc_advective_derivative_mat
Axial momentum conservation - advective (Eulerian) derivative.
Vec _hc_added_heat_rhs
Enthalpy conservation - source and sink.
std::unique_ptr< SolutionHandle > _HTC_soln
std::vector< Real > _z_grid
axial location of nodes
const std::string & name() const
const int & _T_maxit
Maximum iterations for the inner temperature loop.
Mat _amc_pressure_force_mat
Axial momentum conservation - pressure force.
bool _time_integrator_checked
Whether the time integrator has been checked for consistency with the implementation.
void computeWijResidual(int iblock)
Computes Residual Matrix based on the lateral momentum conservation equation for block iblock...
const std::vector< double > x
Real f(Real x)
Test function for Brents method.
std::unique_ptr< SolutionHandle > _q_prime_soln
virtual void syncSolutions(Direction direction) override
const PetscReal & _atol
The absolute convergence tolerance for the ksp linear solver.
Real computeGravityDir(const MooseEnum &dir) const
inline function that is used to define the gravity direction
PetscScalar computeInterpolationCoefficients(PetscScalar Peclet=0.0)
Functions that computes the interpolation scheme given the Peclet number.
Real root(std::function< Real(Real)> const &f, Real x1, Real x2, Real tol=1.0e-12)
Finds the root of a function using Brent&#39;s method.
Definition: BrentsMethod.C:66
const SCMHTCClosureBase * getPinHTCClosure() const
Mat _hc_cross_derivative_mat
Enthalpy conservation - cross flux derivative.
Mat _mc_axial_convection_mat
Mass conservation - axial convection.
Common class for single phase fluid properties.
auto Peclet(const T1 &volume_fraction, const T2 &cp, const T3 &rho, const T4 &vel, const T5 &D_h, const T6 &k)
Compute Peclet number.
Definition: Numerics.h:153
const PetscInt & _maxit
The maximum number of iterations to use for the ksp linear solver.
PetscErrorCode createPetscMatrix(Mat &M, PetscInt n, PetscInt m)
friend PetscErrorCode formFunction(SNES snes, Vec x, Vec f, void *ctx)
This is the residual Vector function in a form compatible with the SNES PETC solvers.
Real computeSweepFlowMixingParameter(unsigned int i_gap, unsigned int iz) const
Computes and validates the sweep-flow mixing parameter.
virtual Node * getChannelNode(unsigned int i_chan, unsigned int iz) const =0
Get the subchannel mesh node for a given channel index and elevation index.
const SCMFrictionClosureBase * getFrictionClosure() const
const MooseEnum _interpolation_scheme
The interpolation method used in constructing the systems.
const SCMFrictionClosureBase * _friction_closure
Friction closure object.
std::unique_ptr< SolutionHandle > _Dpin_soln
bool _deformation
Flag that activates the effect of deformation (pin/duct) based on the auxvalues for displacement...
const SCMHTCClosureBase * getDuctHTCClosure() const
Base class for the 1-phase steady-state/transient subchannel solver.
libMesh::DenseMatrix< Real > _Wij_residual_matrix
std::unique_ptr< SolutionHandle > _mdot_soln
Solutions handles and link to TH tables properties.
PetscErrorCode populateDenseFromVector(const Vec &x, T &solution, const unsigned int first_axial_level, const unsigned int last_axial_level, const unsigned int cross_dimension)
virtual Real computeAddedHeatPin(unsigned int i_ch, unsigned int iz) const =0
Pure virtual: daughters provide different implementations.
const PetscReal & _rtol
The relative convergence tolerance, (relative decrease) for the ksp linear solver.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::unique_ptr< SolutionHandle > _displacement_soln
std::unique_ptr< SolutionHandle > _DP_soln
const bool _compute_viscosity
Flag that activates or deactivates the calculation of viscosity.
libMesh::DenseMatrix< Real > & _Wij
virtual void externalSolve() override
void computeWijPrime(int iblock)
Computes turbulent crossflow per gap for block iblock.
std::unique_ptr< SolutionHandle > _SumWij_soln
void detectDeformation()
Detects whether pin diameter or duct displacement fields require geometry recalculation.
PetscErrorCode petscSnesSolver(int iblock, const libMesh::DenseVector< Real > &solution, libMesh::DenseVector< Real > &root)
Computes solution of nonlinear equation using snes and provided a residual in a formFunction.
libMesh::DenseVector< Real > residualFunction(int iblock, libMesh::DenseVector< Real > solution)
Computes Residual Vector based on the lateral momentum conservation equation for block iblock & updat...
Scalar< const PostprocessorValue > PostprocessorValue
Real _CT
Turbulent modeling parameter used in axial momentum equation.
const bool _verbose_subchannel
Boolean to printout information related to subchannel solve.
Mat _amc_cross_derivative_mat
Axial momentum conservation - cross flux derivative.
void mooseError(Args &&... args) const
const PostprocessorValue & getOutletPressure() const
Get outlet pressure.
const Real & _P_tol
Convergence tolerance for the pressure loop in external solve.
std::unique_ptr< SolutionHandle > _ff_soln
virtual bool solverSystemConverged(const unsigned int) override
struct SubChannel1PhaseProblem::FrictionStruct _friction_args
Mat _hc_advective_derivative_mat
Enthalpy conservation - advective (Eulerian) derivative;.
Base class for subchannel meshes.
void computeWijFromSolve(int iblock)
Computes diversion crossflow per gap for block iblock.
const bool _implicit_bool
Flag to define the usage of a implicit or explicit solution.
Mat _amc_time_derivative_mat
Axial momentum conservation - time derivative.
virtual Real getSubChannelPeripheralDuctWidth(unsigned int i_ch) const =0
Function that computes the width of the duct cell that the peripheral subchannel i_ch sees...
Mat _hc_time_derivative_mat
Enthalpy Enthalpy conservation - time derivative.
PetscErrorCode implicitPetscSolve(int iblock)
Computes implicit solve using PetSc.
void computeDP(int iblock)
Computes Pressure Drop per channel for block iblock.
SubChannel1PhaseProblem(const InputParameters &params)
Mat _cmc_time_derivative_mat
Cross momentum Cross momentum conservation - time derivative.
libMesh::DenseMatrix< Real > _WijPrime
Base class for the convective heat transfer coefficients (HTC) closures used in SCM.
virtual void initialSetup() override
PetscFunctionReturn(LIBMESH_PETSC_SUCCESS)
Mat _cmc_pressure_force_mat
Cross momentum conservation - pressure force.
virtual Real computeAddedHeatDuct(unsigned int i_ch, unsigned int iz) const
Non-pure: implemented in the base (or override in a child if needed)
NusseltStruct(Real Re_, Real Pr_, unsigned int i_pin_, unsigned int iz_, unsigned int i_ch_)
std::unique_ptr< SolutionHandle > _P_soln
std::unique_ptr< SolutionHandle > _w_perim_soln
Mat _cmc_advective_derivative_mat
Cross momentum conservation - advective (Eulerian) derivative.
struct SubChannel1PhaseProblem::NusseltStruct _nusselt_args
const SinglePhaseFluidProperties * _fp
Non-owning pointer to fluid properties user object.
structure with the needed information to compute the Nusselt number at a specific subchannel cell and...
Mat _hc_sys_h_mat
System matrices.
std::unique_ptr< SolutionHandle > _mu_soln
std::unique_ptr< SolutionHandle > _Tpin_soln