https://mooseframework.inl.gov
TriInterWrapper1PhaseProblem.C
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 
11 #include "AuxiliarySystem.h"
12 #include "TriInterWrapperMesh.h"
13 #include "SCM.h"
14 
16 
19 {
21  params.addClassDescription(
22  "Solver class for interwrapper of assemblies in a triangular-lattice arrangement");
23  return params;
24 }
25 
27  : InterWrapper1PhaseProblem(params),
28  _tri_sch_mesh(SCM::getConstMesh<TriInterWrapperMesh>(_subchannel_mesh))
29 {
30 }
31 
32 double
34 {
35  Real a, b;
36  if (Re < 1)
37  {
38  return 64.0;
39  }
40  else if (Re >= 1 and Re < 5000)
41  {
42  a = 64.0;
43  b = -1.0;
44  }
45  else if (Re >= 5000 and Re < 30000)
46  {
47  a = 0.316;
48  b = -0.25;
49  }
50  else
51  {
52  a = 0.184;
53  b = -0.20;
54  }
55  return a * std::pow(Re, b);
56 }
57 
58 void
60 {
61  unsigned int last_node = (iblock + 1) * _block_size;
62  unsigned int first_node = iblock * _block_size + 1;
63 
64  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
65  {
66  auto z_grid = _subchannel_mesh.getZGrid();
67  auto k_grid = _subchannel_mesh.getKGrid();
68  auto dz = z_grid[iz] - z_grid[iz - 1];
69  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
70  {
71  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
72  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
73  auto rho_in = (*_rho_soln)(node_in);
74  auto rho_out = (*_rho_soln)(node_out);
75  auto mu_in = (*_mu_soln)(node_in);
76  auto S = (*_S_flow_soln)(node_in);
77  auto w_perim = (*_w_perim_soln)(node_in);
78  // hydraulic diameter in the i direction
79  auto Dh_i = 4.0 * S / w_perim;
80  auto time_term =
81  _TR * ((*_mdot_soln)(node_out)-_mdot_soln->old(node_out)) * dz / _dt -
82  dz * 2.0 * (*_mdot_soln)(node_out) * (rho_out - _rho_soln->old(node_out)) / rho_in / _dt;
83 
84  auto mass_term1 =
85  std::pow((*_mdot_soln)(node_out), 2.0) * (1.0 / S / rho_out - 1.0 / S / rho_in);
86  auto mass_term2 = -2.0 * (*_mdot_soln)(node_out) * (*_SumWij_soln)(node_out) / S / rho_in;
87 
88  auto crossflow_term = 0.0;
89  auto turbulent_term = 0.0;
90 
91  unsigned int counter = 0;
92  for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
93  {
94  auto chans = _subchannel_mesh.getGapChannels(i_gap);
95  unsigned int ii_ch = chans.first;
96  unsigned int jj_ch = chans.second;
97  auto * node_in_i = _subchannel_mesh.getChannelNode(ii_ch, iz - 1);
98  auto * node_in_j = _subchannel_mesh.getChannelNode(jj_ch, iz - 1);
99  auto * node_out_i = _subchannel_mesh.getChannelNode(ii_ch, iz);
100  auto * node_out_j = _subchannel_mesh.getChannelNode(jj_ch, iz);
101  auto rho_i = (*_rho_soln)(node_in_i);
102  auto rho_j = (*_rho_soln)(node_in_j);
103  auto Si = (*_S_flow_soln)(node_in_i);
104  auto Sj = (*_S_flow_soln)(node_in_j);
105  auto u_star = 0.0;
106  // figure out donor axial velocity
107  if (_Wij(i_gap, iz) > 0.0)
108  u_star = (*_mdot_soln)(node_out_i) / Si / rho_i;
109  else
110  u_star = (*_mdot_soln)(node_out_j) / Sj / rho_j;
111 
112  crossflow_term +=
113  _subchannel_mesh.getCrossflowSign(i_ch, counter) * _Wij(i_gap, iz) * u_star;
114 
115  turbulent_term += _WijPrime(i_gap, iz) * (2 * (*_mdot_soln)(node_out) / rho_in / S -
116  (*_mdot_soln)(node_out_j) / Sj / rho_j -
117  (*_mdot_soln)(node_out_i) / Si / rho_i);
118  counter++;
119  }
120  turbulent_term *= _CT;
121 
122  auto Re = (((*_mdot_soln)(node_in) / S) * Dh_i / mu_in);
123  auto fi = computeFrictionFactor(Re);
124  auto ki = k_grid[i_ch][iz - 1];
125  auto friction_term = (fi * dz / Dh_i + ki) * 0.5 * (std::pow((*_mdot_soln)(node_out), 2.0)) /
126  (S * (*_rho_soln)(node_out));
127  auto gravity_term = _g_grav * (*_rho_soln)(node_out)*dz * S;
128  auto DP = std::pow(S, -1.0) * (time_term + mass_term1 + mass_term2 + crossflow_term +
129  turbulent_term + friction_term + gravity_term); // Pa
130  _DP_soln->set(node_out, DP);
131  }
132  }
133 }
134 
135 void
137 {
138  unsigned int last_node = (iblock + 1) * _block_size;
139  unsigned int first_node = iblock * _block_size + 1;
140 
141  if (iblock == 0)
142  {
143  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
144  {
145  auto * node = _subchannel_mesh.getChannelNode(i_ch, 0);
146  auto h_out = _fp->h_from_p_T((*_P_soln)(node) + _P_out, (*_T_soln)(node));
147  if (h_out < 0)
148  {
149  mooseError(
150  name(), " : Calculation of negative Enthalpy h_out = : ", h_out, " Axial Level= : ", 0);
151  }
152  _h_soln->set(node, h_out);
153  }
154  }
155 
156  for (unsigned int iz = first_node; iz < last_node + 1; iz++)
157  {
158  auto z_grid = _subchannel_mesh.getZGrid();
159  auto dz = z_grid[iz] - z_grid[iz - 1];
160  auto heated_length = _subchannel_mesh.getHeatedLength();
161  auto unheated_length_entry = _subchannel_mesh.getHeatedLengthEntry();
162 
163  Real gedge_ave = 0.0;
164  Real mdot_sum = 0.0;
165  Real si_sum = 0.0;
166  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
167  {
168  auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
169  if (subch_type == EChannelType::EDGE || subch_type == EChannelType::CORNER)
170  {
171  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
172  auto Si = (*_S_flow_soln)(node_in);
173  auto mdot_in = (*_mdot_soln)(node_in);
174  mdot_sum = mdot_sum + mdot_in;
175  si_sum = si_sum + Si;
176  }
177  }
178  gedge_ave = mdot_sum / si_sum;
179 
180  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
181  {
182  const Real & pitch = _subchannel_mesh.getPitch();
183  const Real & assembly_diameter = _subchannel_mesh.getSideX();
184  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
185  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, iz);
186  auto mdot_in = (*_mdot_soln)(node_in);
187  auto h_in = (*_h_soln)(node_in); // J/kg
188  auto volume = dz * (*_S_flow_soln)(node_in);
189  auto mdot_out = (*_mdot_soln)(node_out);
190  auto h_out = 0.0;
191  Real sumWijh = 0.0;
192  Real sumWijPrimeDhij = 0.0;
193  Real e_cond = 0.0;
194 
195  Real added_enthalpy;
196  if (z_grid[iz] > unheated_length_entry && z_grid[iz] <= unheated_length_entry + heated_length)
197  added_enthalpy = ((*_q_prime_soln)(node_out) + (*_q_prime_soln)(node_in)) * dz / 2.0;
198  else
199  added_enthalpy = 0.0;
200 
201  // compute the sweep flow enthalpy change
202  auto subch_type = _subchannel_mesh.getSubchannelType(i_ch);
203  Real sweep_enthalpy = 0.0;
204 
205  if (subch_type == EChannelType::EDGE || subch_type == EChannelType::CORNER)
206  {
207  const Real & pitch = _subchannel_mesh.getPitch();
208  const Real & assembly_diameter = _subchannel_mesh.getSideX();
209  const Real & wire_lead_length = 0.0;
210  const Real & wire_diameter = 0.0;
211  auto gap = _tri_sch_mesh.getDuctToPinGap();
212  auto w = assembly_diameter + gap;
213  auto theta =
214  std::acos(wire_lead_length /
215  std::sqrt(std::pow(wire_lead_length, 2) +
216  std::pow(libMesh::pi * (assembly_diameter + wire_diameter), 2)));
217  // in/out channels for i_ch
218  auto sweep_in = _tri_sch_mesh.getSweepFlowChans(i_ch).first;
219  auto * node_sin = _subchannel_mesh.getChannelNode(sweep_in, iz - 1);
220  auto cs_t = 0.75 * std::pow(wire_lead_length / assembly_diameter, 0.3);
221  auto ar2 = libMesh::pi * (assembly_diameter + wire_diameter) * wire_diameter / 4.0;
222  auto a2p = pitch * (w - assembly_diameter / 2.0) -
223  libMesh::pi * std::pow(assembly_diameter, 2) / 8.0;
224  auto Sij_in = dz * gap;
225  auto Sij_out = dz * gap;
226  auto wsweep_in = gedge_ave * cs_t * std::pow((ar2 / a2p), 0.5) * std::tan(theta) * Sij_in;
227  auto wsweep_out = gedge_ave * cs_t * std::pow((ar2 / a2p), 0.5) * std::tan(theta) * Sij_out;
228  auto sweep_hin = (*_h_soln)(node_sin);
229  auto sweep_hout = (*_h_soln)(node_in);
230  sweep_enthalpy = (wsweep_in * sweep_hin - wsweep_out * sweep_hout);
231  }
232 
233  // Calculate sum of crossflow into channel i from channels j around i
234  unsigned int counter = 0;
235  for (auto i_gap : _subchannel_mesh.getChannelGaps(i_ch))
236  {
237  auto chans = _subchannel_mesh.getGapChannels(i_gap);
238  unsigned int ii_ch = chans.first;
239  // i is always the smallest and first index in the mapping
240  unsigned int jj_ch = chans.second;
241  auto * node_in_i = _subchannel_mesh.getChannelNode(ii_ch, iz - 1);
242  auto * node_in_j = _subchannel_mesh.getChannelNode(jj_ch, iz - 1);
243  // Define donor enthalpy
244  auto h_star = 0.0;
245  if (_Wij(i_gap, iz) > 0.0)
246  h_star = (*_h_soln)(node_in_i);
247  else if (_Wij(i_gap, iz) < 0.0)
248  h_star = (*_h_soln)(node_in_j);
249  // take care of the sign by applying the map, use donor cell
250  sumWijh += _subchannel_mesh.getCrossflowSign(i_ch, counter) * _Wij(i_gap, iz) * h_star;
251  sumWijPrimeDhij += _WijPrime(i_gap, iz) * (2 * (*_h_soln)(node_in) - (*_h_soln)(node_in_j) -
252  (*_h_soln)(node_in_i));
253  counter++;
254 
255  // compute the radial heat conduction through gaps
256  auto subch_type_i = _subchannel_mesh.getSubchannelType(ii_ch);
257  auto subch_type_j = _subchannel_mesh.getSubchannelType(jj_ch);
258  Real dist_ij = pitch;
259 
260  if (subch_type_i == EChannelType::EDGE && subch_type_j == EChannelType::EDGE)
261  {
262  dist_ij = pitch;
263  }
264  else if ((subch_type_i == EChannelType::CORNER && subch_type_j == EChannelType::EDGE) ||
265  (subch_type_i == EChannelType::EDGE && subch_type_j == EChannelType::CORNER))
266  {
267  dist_ij = pitch;
268  }
269  else
270  {
271  dist_ij = pitch / std::sqrt(3);
272  }
273 
274  auto Sij = dz * _subchannel_mesh.getGapWidth(i_gap);
275  auto thcon_i = _fp->k_from_p_T((*_P_soln)(node_in_i), (*_T_soln)(node_in_i));
276  auto thcon_j = _fp->k_from_p_T((*_P_soln)(node_in_j), (*_T_soln)(node_in_j));
277  auto shape_factor =
278  0.66 * (pitch / assembly_diameter) *
279  std::pow((_subchannel_mesh.getGapWidth(i_gap) / assembly_diameter), -0.3);
280  if (ii_ch == i_ch)
281  {
282  e_cond += 0.5 * (thcon_i + thcon_j) * Sij * shape_factor *
283  ((*_T_soln)(node_in_j) - (*_T_soln)(node_in_i)) / dist_ij;
284  }
285  else
286  {
287  e_cond += -0.5 * (thcon_i + thcon_j) * Sij * shape_factor *
288  ((*_T_soln)(node_in_j) - (*_T_soln)(node_in_i)) / dist_ij;
289  }
290  }
291 
292  // compute the axial heat conduction between current and lower axial node
293  auto * node_in_i = _subchannel_mesh.getChannelNode(i_ch, iz);
294  auto * node_in_j = _subchannel_mesh.getChannelNode(i_ch, iz - 1);
295  auto thcon_i = _fp->k_from_p_T((*_P_soln)(node_in_i), (*_T_soln)(node_in_i));
296  auto thcon_j = _fp->k_from_p_T((*_P_soln)(node_in_j), (*_T_soln)(node_in_j));
297  auto Si = (*_S_flow_soln)(node_in_i);
298  auto dist_ij = z_grid[iz] - z_grid[iz - 1];
299 
300  e_cond += 0.5 * (thcon_i + thcon_j) * Si * ((*_T_soln)(node_in_j) - (*_T_soln)(node_in_i)) /
301  dist_ij;
302 
303  unsigned int nz = _subchannel_mesh.getNumOfAxialCells();
304  // compute the axial heat conduction between current and upper axial node
305  if (iz < nz)
306  {
307 
308  auto * node_in_i = _subchannel_mesh.getChannelNode(i_ch, iz);
309  auto * node_in_j = _subchannel_mesh.getChannelNode(i_ch, iz + 1);
310  auto thcon_i = _fp->k_from_p_T((*_P_soln)(node_in_i), (*_T_soln)(node_in_i));
311  auto thcon_j = _fp->k_from_p_T((*_P_soln)(node_in_j), (*_T_soln)(node_in_j));
312  auto Si = (*_S_flow_soln)(node_in_i);
313  auto dist_ij = z_grid[iz + 1] - z_grid[iz];
314  e_cond += 0.5 * (thcon_i + thcon_j) * Si * ((*_T_soln)(node_in_j) - (*_T_soln)(node_in_i)) /
315  dist_ij;
316  }
317 
318  // end of radial heat conduction calc.
319 
320  h_out =
321  (mdot_in * h_in - sumWijh - sumWijPrimeDhij + added_enthalpy + e_cond + sweep_enthalpy +
322  _TR * _rho_soln->old(node_out) * _h_soln->old(node_out) * volume / _dt) /
323  (mdot_out + _TR * (*_rho_soln)(node_out)*volume / _dt);
324 
325  if (h_out < 0)
326  {
327  mooseWarning(name(),
328  " : Calculation of negative Enthalpy h_out = : ",
329  h_out,
330  " Axial Level= : ",
331  iz);
332  }
333  _h_soln->set(node_out, h_out); // J/kg
334  }
335  }
336 }
337 
338 void
340 {
342  _console << "Executing subchannel solver\n";
343  auto P_error = 1.0;
344  unsigned int P_it = 0;
345  unsigned int P_it_max = 2 * _n_blocks;
346  if (_n_blocks == 1)
347  P_it_max = 1;
348  while (P_error > _P_tol && P_it < P_it_max)
349  {
350  P_it += 1;
351  if (P_it == P_it_max and _n_blocks != 1)
352  {
353  _console << "Reached maximum number of axial pressure iterations" << std::endl;
354  _converged = false;
355  }
356  _console << "Solving Outer Iteration : " << P_it << std::endl;
357  auto P_L2norm_old_axial = _P_soln->L2norm();
358  for (unsigned int iblock = 0; iblock < _n_blocks; iblock++)
359  {
360  int last_level = (iblock + 1) * _block_size;
361  int first_level = iblock * _block_size + 1;
362  auto T_block_error = 1.0;
363  auto T_it = 0;
364  _console << "Solving Block: " << iblock << " From first level: " << first_level
365  << " to last level: " << last_level << std::endl;
366 
367  while (T_block_error > _T_tol && T_it < _T_maxit)
368  {
369  T_it += 1;
370  if (T_it == _T_maxit)
371  {
372  _console << "Reached maximum number of temperature iterations for block: " << iblock
373  << std::endl;
374  _converged = false;
375  }
376  auto T_L2norm_old_block = _T_soln->L2norm();
377 
378  // computeWij(iblock);
379  computeWijFromSolve(iblock);
380 
381  if (_compute_power)
382  {
383  computeh(iblock);
384 
385  computeT(iblock);
386  }
387 
388  if (_compute_density)
389  computeRho(iblock);
390 
391  if (_compute_viscosity)
392  computeMu(iblock);
393 
394  // We must do a global assembly to make sure data is parallel consistent before we do things
395  // like compute L2 norms
396  _aux->solution().close();
397 
398  auto T_L2norm_new = _T_soln->L2norm();
399  T_block_error =
400  std::abs((T_L2norm_new - T_L2norm_old_block) / (T_L2norm_old_block + 1E-14));
401  _console << "T_block_error: " << T_block_error << std::endl;
402  }
403  }
404  auto P_L2norm_new_axial = _P_soln->L2norm();
405  P_error =
406  std::abs((P_L2norm_new_axial - P_L2norm_old_axial) / (P_L2norm_old_axial + _P_out + 1E-14));
407  _console << "P_error :" << P_error << std::endl;
408  }
409  // update old crossflow matrix
410  _Wij_old = _Wij;
411  _console << "Finished executing subchannel solver\n";
412  _aux->solution().close();
413 
414  auto power_in = 0.0;
415  auto power_out = 0.0;
416  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
417  {
418  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, 0);
419  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, _n_cells);
420  power_in += (*_mdot_soln)(node_in) * (*_h_soln)(node_in);
421  power_out += (*_mdot_soln)(node_out) * (*_h_soln)(node_out);
422  }
423 
425  auto Total_surface_area = 0.0;
426  auto mass_flow_in = 0.0;
427  auto mass_flow_out = 0.0;
428  for (unsigned int i_ch = 0; i_ch < _n_channels; i_ch++)
429  {
430  auto * node_in = _subchannel_mesh.getChannelNode(i_ch, 0);
431  auto * node_out = _subchannel_mesh.getChannelNode(i_ch, _n_cells);
432  Total_surface_area += (*_S_flow_soln)(node_in);
433  mass_flow_in += (*_mdot_soln)(node_in);
434  mass_flow_out += (*_mdot_soln)(node_out);
435  }
436  auto h_bulk_out = power_out / mass_flow_out;
437  auto T_bulk_out = _fp->T_from_p_h(_P_out, h_bulk_out);
438 
439  _console << " ======================================= " << std::endl;
440  _console << " ======== Subchannel Print Outs ======== " << std::endl;
441  _console << " ======================================= " << std::endl;
442  _console << "Total Surface Area :" << Total_surface_area << " m^2" << std::endl;
443  _console << "Bulk coolant temperature at outlet :" << T_bulk_out << " K" << std::endl;
444  _console << "Power added to coolant is: " << power_out - power_in << " Watt" << std::endl;
445  _console << "Mass in: " << mass_flow_in << " kg/sec" << std::endl;
446  _console << "Mass out: " << mass_flow_out << " kg/sec" << std::endl;
447  _console << " ======================================= " << std::endl;
448 }
const bool _compute_density
Flag that activates or deactivates the calculation of density.
virtual const std::vector< std::vector< Real > > & getKGrid() const
Get axial cell location and value of loss coefficient.
virtual Real computeFrictionFactor(Real Re) override
Computes the axial friction factor for the sodium coolant and for each subchannel.
Real _TR
Flag that activates or deactivates the transient parts of the equations we solve by multiplication...
registerMooseObject("SubChannelApp", TriInterWrapper1PhaseProblem)
std::unique_ptr< SolutionHandle > _P_soln
virtual const unsigned int & getNumOfAxialCells() const
Return the number of axial cells.
const int & _T_maxit
Maximum iterations for the inner temperature loop.
const Real & _P_tol
Convergence tolerance for the pressure loop in external solve.
virtual const Real & getSideX() const
Return side lengths of the assembly.
virtual const Real & getHeatedLength() const
Return heated length.
Triangular interwrapper solver.
virtual void computeRho(int iblock)
Computes Density per channel for block iblock.
virtual const std::pair< unsigned int, unsigned int > & getGapChannels(unsigned int i_gap) const =0
Return a pair of inter-wrapper indices for a given gap index.
virtual const Real & getHeatedLengthEntry() const
Return unheated length at entry.
virtual void computeT(int iblock)
Computes Temperature per channel for block iblock.
virtual void computeDP(int iblock) override
computeDP(int iz) is defined/overridden in order to use the friction factor for sodium ...
const TriInterWrapperMesh & _tri_sch_mesh
std::unique_ptr< SolutionHandle > _SumWij_soln
const Real & _P_out
Outlet Pressure.
static InputParameters validParams()
Base class for the 1-phase steady-state/transient interwrapper solver.
std::unique_ptr< SolutionHandle > _rho_soln
std::unique_ptr< SolutionHandle > _mdot_soln
const SinglePhaseFluidProperties * _fp
Solutions handles and link to TH tables properties.
virtual const std::string & name() const
void mooseWarning(Args &&... args) const
std::unique_ptr< SolutionHandle > _T_soln
static const std::string S
Definition: NS.h:163
static const std::string pitch
const T & getConstMesh(const MooseMesh &mesh)
function to cast const mesh
Definition: SCM.h:21
virtual void computeh(int iblock) override
computeMassFlowForDPDZ() and enforceUniformDPDZAtInlet() are overriden to define the sodium friction ...
TriInterWrapper1PhaseProblem(const InputParameters &params)
std::shared_ptr< AuxiliarySystem > _aux
virtual const std::pair< unsigned int, unsigned int > & getSweepFlowChans(unsigned int i_chan) const
unsigned int _n_blocks
number of axial blocks
const InterWrapperMesh & _subchannel_mesh
Real volume(const MeshBase &mesh, unsigned int dim=libMesh::invalid_uint)
std::unique_ptr< SolutionHandle > _DP_soln
const bool _compute_viscosity
Flag that activates or deactivates the calculation of viscosity.
virtual Node * getChannelNode(unsigned int i_chan, unsigned iz) const =0
Get the inter-wrapper mesh node for a given channel index and elevation index.
virtual Real getGapWidth(unsigned int gap_index) const =0
Return gap width for a given gap index.
virtual void computeWijFromSolve(int iblock)
Computes diversion crossflow per gap for block with index iblock Block is a partition of the whole do...
const Real & _T_tol
Convergence tolerance for the temperature loop in external solve.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::unique_ptr< SolutionHandle > _q_prime_soln
virtual void initializeSolution()
Function to initialize the solution fields.
virtual void computeMu(int iblock)
Computes Viscosity per channel for block iblock.
virtual const std::vector< Real > & getZGrid() const
Get axial location of layers.
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
std::unique_ptr< SolutionHandle > _h_soln
libMesh::DenseMatrix< Real > _Wij_old
const bool _compute_power
Flag that informs if we need to solve the Enthalpy/Temperature equations or not.
const ConsoleStream _console
libMesh::DenseMatrix< Real > & _Wij
bool _converged
Variable that informs whether we exited external solve with a converged solution or not...
libMesh::DenseMatrix< Real > _WijPrime
Mesh class for triangular, edge and corner inter_wrappers for hexagonal lattice fuel assemblies...
MooseUnits pow(const MooseUnits &, int)
virtual const Real & getPitch() const
Return the pitch between 2 inter-wrappers.
virtual EChannelType getSubchannelType(unsigned int index) const =0
Return the type of the inter-wrapper for given inter-wrapper index.
virtual const std::vector< unsigned int > & getChannelGaps(unsigned int i_chan) const =0
Return a vector of gap indices for a given channel index.
Definition: SCM.h:16
const Real pi
virtual const Real & getDuctToPinGap() const
const Real & _CT
Turbulent modeling parameter used in axial momentum equation.
virtual const Real & getCrossflowSign(unsigned int i_chan, unsigned int i_local) const =0
Return a signs for the cross flow given a inter-wrapper index and local neighbor index.