GEOS
ThermalFluxComputeKernel.hpp
Go to the documentation of this file.
1 /*
2  * ------------------------------------------------------------------------------------------------------------
3  * SPDX-License-Identifier: LGPL-2.1-only
4  *
5  * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC
6  * Copyright (c) 2018-2024 TotalEnergies
7  * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University
8  * Copyright (c) 2023-2024 Chevron
9  * Copyright (c) 2019- GEOS/GEOSX Contributors
10  * All rights reserved
11  *
12  * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
13  * ------------------------------------------------------------------------------------------------------------
14  */
15 
20 #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALFLUXCOMPUTEKERNEL_HPP
21 #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALFLUXCOMPUTEKERNEL_HPP
22 
24 
25 #include "constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp"
26 #include "constitutive/thermalConductivity/ThermalConductivityFields.hpp"
27 
28 namespace geos
29 {
30 
31 namespace thermalSinglePhaseFVMKernels
32 {
33 /******************************** FluxComputeKernel ********************************/
34 
41 template< integer NUM_EQN, integer NUM_DOF, typename STENCILWRAPPER >
42 class FluxComputeKernel : public singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >
43 {
44 public:
45 
52  template< typename VIEWTYPE >
54 
56  using DofNumberAccessor = AbstractBase::DofNumberAccessor;
60 
61  using AbstractBase::m_dt;
64  using AbstractBase::m_gravCoef;
65  using AbstractBase::m_mob;
67 
69  using Base::numDof;
70  using Base::numEqn;
71  using Base::maxNumElems;
72  using Base::maxNumConns;
75  using Base::m_seri;
76  using Base::m_sesri;
77  using Base::m_sei;
78 
80  StencilAccessors< fields::flow::temperature,
81  fields::flow::dMobility_dTemperature >;
82 
84  StencilMaterialAccessors< constitutive::SingleFluidBase,
85  fields::singlefluid::dDensity_dTemperature,
86  fields::singlefluid::enthalpy,
87  fields::singlefluid::dEnthalpy_dPressure,
88  fields::singlefluid::dEnthalpy_dTemperature >;
89 
91  StencilMaterialAccessors< constitutive::SinglePhaseThermalConductivityBase,
92  fields::thermalconductivity::effectiveConductivity,
93  fields::thermalconductivity::dEffectiveConductivity_dT >;
94 
95 
111  FluxComputeKernel( globalIndex const rankOffset,
112  STENCILWRAPPER const & stencilWrapper,
113  DofNumberAccessor const & dofNumberAccessor,
114  SinglePhaseFlowAccessors const & singlePhaseFlowAccessors,
115  ThermalSinglePhaseFlowAccessors const & thermalSinglePhaseFlowAccessors,
116  SinglePhaseFluidAccessors const & singlePhaseFluidAccessors,
117  ThermalSinglePhaseFluidAccessors const & thermalSinglePhaseFluidAccessors,
118  PermeabilityAccessors const & permeabilityAccessors,
119  ThermalConductivityAccessors const & thermalConductivityAccessors,
120  real64 const & dt,
121  CRSMatrixView< real64, globalIndex const > const & localMatrix,
122  arrayView1d< real64 > const & localRhs )
123  : Base( rankOffset,
124  stencilWrapper,
125  dofNumberAccessor,
126  singlePhaseFlowAccessors,
127  singlePhaseFluidAccessors,
128  permeabilityAccessors,
129  dt,
130  localMatrix,
131  localRhs ),
132  m_temp( thermalSinglePhaseFlowAccessors.get( fields::flow::temperature {} ) ),
133  m_dMob_dTemp( thermalSinglePhaseFlowAccessors.get( fields::flow::dMobility_dTemperature {} ) ),
134  m_dDens_dTemp( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dDensity_dTemperature {} ) ),
135  m_enthalpy( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::enthalpy {} ) ),
136  m_dEnthalpy_dPres( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dEnthalpy_dPressure {} ) ),
137  m_dEnthalpy_dTemp( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dEnthalpy_dTemperature {} ) ),
138  m_thermalConductivity( thermalConductivityAccessors.get( fields::thermalconductivity::effectiveConductivity {} ) ),
139  m_dThermalCond_dT( thermalConductivityAccessors.get( fields::thermalconductivity::dEffectiveConductivity_dT {} ) )
140  {}
141 
143  {
144 public:
145 
147  StackVariables( localIndex const size, localIndex numElems )
148  : Base::StackVariables( size, numElems ),
149  energyFlux( 0.0 ),
150  dEnergyFlux_dP( size ),
151  dEnergyFlux_dT( size )
152  {}
153 
161 
162  // Thermal transmissibility
163  real64 thermalTransmissibility[maxNumConns][2]{};
164 
167 
168  // Energy fluxes and derivatives
169 
176 
177  };
178 
185  void computeFlux( localIndex const iconn,
186  StackVariables & stack ) const
187  {
188  // ***********************************************
189  // First, we call the base computeFlux to compute:
190  // 1) compFlux and its derivatives (including derivatives wrt temperature),
191  // 2) enthalpy part of energyFlux and its derivatives (including derivatives wrt temperature)
192  //
193  // Computing dFlux_dT and the enthalpy flux requires quantities already computed in the base computeFlux,
194  // such as potGrad, fluxVal, and the indices of the upwind cell
195  // We use the lambda below (called **inside** the phase loop of the base computeFlux) to access these variables
196  Base::computeFlux( iconn, stack, [&] ( localIndex const (&k)[2],
197  localIndex const (&seri)[2],
198  localIndex const (&sesri)[2],
199  localIndex const (&sei)[2],
200  localIndex const connectionIndex,
201  real64 const alpha,
202  real64 const mobility,
203  real64 const & potGrad,
204  real64 const & fluxVal,
205  real64 const (&dFlux_dP)[2] )
206  {
207  // Step 1: compute the derivatives of the mean density at the interface wrt temperature
208 
209  real64 dDensMean_dT[2]{0.0, 0.0};
210 
211  real64 const trans[2] = { stack.transmissibility[connectionIndex][0], stack.transmissibility[connectionIndex][1] };
212 
213  for( integer ke = 0; ke < 2; ++ke )
214  {
215  real64 const dDens_dT = m_dDens_dTemp[seri[ke]][sesri[ke]][sei[ke]][0];
216  dDensMean_dT[ke] = 0.5 * dDens_dT;
217  }
218 
219  // Step 2: compute the derivatives of the potential difference wrt temperature
220  //***** calculation of flux *****
221 
222  real64 dGravHead_dT[2]{0.0, 0.0};
223 
224  // compute potential difference
225  for( integer ke = 0; ke < 2; ++ke )
226  {
227  localIndex const er = seri[ke];
228  localIndex const esr = sesri[ke];
229  localIndex const ei = sei[ke];
230 
231  // compute derivative of gravity potential difference wrt temperature
232  real64 const gravD = trans[ke] * m_gravCoef[er][esr][ei];
233 
234  for( integer i = 0; i < 2; ++i )
235  {
236  dGravHead_dT[i] += dDensMean_dT[i] * gravD;
237  }
238  }
239 
240  // Step 3: compute the derivatives of the (upwinded) compFlux wrt temperature
241  // *** upwinding ***
242 
243  real64 dFlux_dT[2]{0.0, 0.0};
244 
245  // Step 3.1: compute the derivative of flux wrt temperature
246  for( integer ke = 0; ke < 2; ++ke )
247  {
248  dFlux_dT[ke] -= dGravHead_dT[ke];
249  }
250 
251  for( integer ke = 0; ke < 2; ++ke )
252  {
253  dFlux_dT[ke] *= mobility;
254  }
255 
256  real64 dMob_dT[2]{};
257 
258  if( alpha <= 0.0 || alpha >= 1.0 )
259  {
260  localIndex const k_up = 1 - localIndex( fmax( fmin( alpha, 1.0 ), 0.0 ) );
261 
262  dMob_dT[k_up] = m_dMob_dTemp[seri[k_up]][sesri[k_up]][sei[k_up]];
263  }
264  else
265  {
266  real64 const mobWeights[2] = { alpha, 1.0 - alpha };
267  for( integer ke = 0; ke < 2; ++ke )
268  {
269  dMob_dT[ke] = mobWeights[ke] * m_dMob_dTemp[seri[ke]][sesri[ke]][sei[ke]];
270  }
271  }
272 
273  // add contribution from upstream cell mobility derivatives
274  for( integer ke = 0; ke < 2; ++ke )
275  {
276  dFlux_dT[ke] += dMob_dT[ke] * potGrad;
277  }
278 
279  // add dFlux_dTemp to localFluxJacobian
280  for( integer ke = 0; ke < 2; ++ke )
281  {
282  localIndex const localDofIndexTemp = k[ke] * numDof + numDof - 1;
283  stack.localFluxJacobian[k[0]*numEqn][localDofIndexTemp] += m_dt * dFlux_dT[ke];
284  stack.localFluxJacobian[k[1]*numEqn][localDofIndexTemp] -= m_dt * dFlux_dT[ke];
285  }
286 
287  // Step 4: compute the enthalpy flux
288  real64 enthalpy = 0.0;
289  real64 dEnthalpy_dP[2]{0.0, 0.0};
290  real64 dEnthalpy_dT[2]{0.0, 0.0};
291 
292  if( alpha <= 0.0 || alpha >= 1.0 )
293  {
294  localIndex const k_up = 1 - localIndex( fmax( fmin( alpha, 1.0 ), 0.0 ) );
295 
296  enthalpy = m_enthalpy[seri[k_up]][sesri[k_up]][sei[k_up]][0];
297  dEnthalpy_dP[k_up] = m_dEnthalpy_dPres[seri[k_up]][sesri[k_up]][sei[k_up]][0];
298  dEnthalpy_dT[k_up] = m_dEnthalpy_dTemp[seri[k_up]][sesri[k_up]][sei[k_up]][0];
299  }
300  else
301  {
302  real64 const mobWeights[2] = { alpha, 1.0 - alpha };
303  for( integer ke = 0; ke < 2; ++ke )
304  {
305  enthalpy += mobWeights[ke] * m_enthalpy[seri[ke]][sesri[ke]][sei[ke]][0];
306  dEnthalpy_dP[ke] = mobWeights[ke] * m_dEnthalpy_dPres[seri[ke]][sesri[ke]][sei[ke]][0];
307  dEnthalpy_dT[ke] = mobWeights[ke] * m_dEnthalpy_dTemp[seri[ke]][sesri[ke]][sei[ke]][0];
308  }
309  }
310 
311  stack.energyFlux += fluxVal * enthalpy;
312 
313  for( integer ke = 0; ke < 2; ++ke )
314  {
315  stack.dEnergyFlux_dP[ke] += dFlux_dP[ke] * enthalpy;
316  stack.dEnergyFlux_dT[ke] += dFlux_dT[ke] * enthalpy;
317  }
318 
319  for( integer ke = 0; ke < 2; ++ke )
320  {
321  stack.dEnergyFlux_dP[ke] += fluxVal * dEnthalpy_dP[ke];
322  stack.dEnergyFlux_dT[ke] += fluxVal * dEnthalpy_dT[ke];
323  }
324 
325  } );
326 
327  // *****************************************************
328  // Computation of the conduction term in the energy flux
329  // Note that the enthalpy term in the energy was computed above
330  // Note that this term is computed using an explicit treatment of conductivity for now
331 
332  // Step 1: compute the thermal transmissibilities at this face
333  // We follow how the thermal compositional multi-phase solver does to update the thermal transmissibility
334  m_stencilWrapper.computeWeights( iconn,
337  stack.thermalTransmissibility,
338  stack.dThermalTrans_dT );
339 
340  localIndex k[2];
341  localIndex connectionIndex = 0;
342 
343  for( k[0] = 0; k[0] < stack.numFluxElems; ++k[0] )
344  {
345  for( k[1] = k[0] + 1; k[1] < stack.numFluxElems; ++k[1] )
346  {
347  real64 const thermalTrans[2] = { stack.thermalTransmissibility[connectionIndex][0], stack.thermalTransmissibility[connectionIndex][1] };
348  real64 const dThermalTrans_dT[2] = { stack.dThermalTrans_dT[connectionIndex][0], stack.dThermalTrans_dT[connectionIndex][1] };
349 
350  localIndex const seri[2] = {m_seri( iconn, k[0] ), m_seri( iconn, k[1] )};
351  localIndex const sesri[2] = {m_sesri( iconn, k[0] ), m_sesri( iconn, k[1] )};
352  localIndex const sei[2] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )};
353 
354  // Step 2: compute temperature difference at the interface
355  for( integer ke = 0; ke < 2; ++ke )
356  {
357  localIndex const er = seri[ke];
358  localIndex const esr = sesri[ke];
359  localIndex const ei = sei[ke];
360 
361  stack.energyFlux += thermalTrans[ke] * m_temp[er][esr][ei];
362  stack.dEnergyFlux_dT[ke] += thermalTrans[ke] + dThermalTrans_dT[ke] * m_temp[er][esr][ei];
363  }
364 
365  // add energyFlux and its derivatives to localFlux and localFluxJacobian
366  stack.localFlux[k[0]*numEqn + numEqn - 1] += m_dt * stack.energyFlux;
367  stack.localFlux[k[1]*numEqn + numEqn - 1] -= m_dt * stack.energyFlux;
368 
369  for( integer ke = 0; ke < 2; ++ke )
370  {
371  integer const localDofIndexPres = k[ke] * numDof;
372  stack.localFluxJacobian[k[0]*numEqn + numEqn - 1][localDofIndexPres] = m_dt * stack.dEnergyFlux_dP[ke];
373  stack.localFluxJacobian[k[1]*numEqn + numEqn - 1][localDofIndexPres] = -m_dt * stack.dEnergyFlux_dP[ke];
374  integer const localDofIndexTemp = localDofIndexPres + numDof - 1;
375  stack.localFluxJacobian[k[0]*numEqn + numEqn - 1][localDofIndexTemp] = m_dt * stack.dEnergyFlux_dT[ke];
376  stack.localFluxJacobian[k[1]*numEqn + numEqn - 1][localDofIndexTemp] = -m_dt * stack.dEnergyFlux_dT[ke];
377  }
378 
379  connectionIndex++;
380  }
381  }
382  }
383 
390  void complete( localIndex const iconn,
391  StackVariables & stack ) const
392  {
393  // Call Case::complete to assemble the mass balance equations
394  // In the lambda, add contribution to residual and jacobian into the energy balance equation
395  Base::complete( iconn, stack, [&] ( integer const i,
396  localIndex const localRow )
397  {
398  // The no. of fluxes is equal to the no. of equations in m_localRhs and m_localMatrix
399  // Different from the one in compositional multi-phase flow, which has a volume balance eqn.
400  RAJA::atomicAdd( parallelDeviceAtomic{}, &AbstractBase::m_localRhs[localRow + numEqn-1], stack.localFlux[i * numEqn + numEqn-1] );
401 
402  AbstractBase::m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic >( localRow + numEqn-1,
403  stack.dofColIndices.data(),
404  stack.localFluxJacobian[i * numEqn + numEqn-1].dataIfContiguous(),
405  stack.stencilSize * numDof );
406 
407  } );
408  }
409 
410 protected:
411 
414 
417 
420 
423  ElementViewConst< arrayView2d< real64 const > > const m_dEnthalpy_dPres;
424  ElementViewConst< arrayView2d< real64 const > > const m_dEnthalpy_dTemp;
425 
428 
431 
432 };
433 
438 {
439 public:
440 
454  template< typename POLICY, typename STENCILWRAPPER >
455  static void
456  createAndLaunch( globalIndex const rankOffset,
457  string const & dofKey,
458  string const & solverName,
459  ElementRegionManager const & elemManager,
460  STENCILWRAPPER const & stencilWrapper,
461  real64 const & dt,
462  CRSMatrixView< real64, globalIndex const > const & localMatrix,
463  arrayView1d< real64 > const & localRhs )
464  {
465  integer constexpr NUM_DOF = 2;
466  integer constexpr NUM_EQN = 2;
467 
469  elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey );
470  dofNumberAccessor.setName( solverName + "/accessors/" + dofKey );
471 
473  typename KernelType::SinglePhaseFlowAccessors flowAccessors( elemManager, solverName );
474  typename KernelType::ThermalSinglePhaseFlowAccessors thermalFlowAccessors( elemManager, solverName );
475  typename KernelType::SinglePhaseFluidAccessors fluidAccessors( elemManager, solverName );
476  typename KernelType::ThermalSinglePhaseFluidAccessors thermalFluidAccessors( elemManager, solverName );
477  typename KernelType::PermeabilityAccessors permAccessors( elemManager, solverName );
478  typename KernelType::ThermalConductivityAccessors thermalConductivityAccessors( elemManager, solverName );
479 
480  KernelType kernel( rankOffset, stencilWrapper, dofNumberAccessor,
481  flowAccessors, thermalFlowAccessors, fluidAccessors, thermalFluidAccessors,
482  permAccessors, thermalConductivityAccessors,
483  dt, localMatrix, localRhs );
484  KernelType::template launch< POLICY >( stencilWrapper.size(), kernel );
485  }
486 };
487 
488 } // namespace thermalSinglePhaseFVMKernels
489 
490 } // namespace geos
491 
492 #endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALFLUXCOMPUTEKERNEL_HPP
#define GEOS_HOST_DEVICE
Marks a host-device function.
Definition: GeosxMacros.hpp:49
The ElementRegionManager class provides an interface to ObjectManagerBase in order to manage ElementR...
ElementViewAccessor< ArrayView< T const, NDIM, getUSD< PERM > > > constructArrayViewAccessor(string const &name, string const &neighborName=string()) const
This is a function to construct a ElementViewAccessor to access array data registered on the mesh.
array1d< array1d< VIEWTYPE > > ElementViewAccessor
The ElementViewAccessor at the ElementRegionManager level is an array of array of VIEWTYPE.
typename ElementViewAccessor< VIEWTYPE >::NestedViewTypeConst ElementViewConst
The ElementViewAccessor at the ElementRegionManager level is the type resulting from ElementViewAcces...
A struct to automatically construct and store element view accessors.
A struct to automatically construct and store element view accessors.
Base class for FluxComputeKernel that holds all data not dependent on template parameters (like stenc...
ElementViewConst< arrayView1d< real64 const > > const m_mob
Views on fluid mobility.
ElementViewConst< arrayView1d< globalIndex const > > const m_dofNumber
Views on dof numbers.
arrayView1d< real64 > const m_localRhs
View on the local RHS.
ElementViewConst< arrayView2d< real64 const > > const m_dens
Views on fluid density.
globalIndex const m_rankOffset
Offset for my MPI rank.
CRSMatrixView< real64, globalIndex const > const m_localMatrix
View on the local CRS matrix.
Define the interface for the assembly kernel in charge of flux terms.
static constexpr integer numEqn
Compute time value for the number of equations.
static constexpr localIndex maxNumConns
Maximum number of connections at the face.
GEOS_HOST_DEVICE void complete(localIndex const iconn, StackVariables &stack, FUNC &&kernelOp=NoOpFunc{}) const
Performs the complete phase for the kernel.
static constexpr localIndex maxStencilSize
Maximum number of points in the stencil.
STENCILWRAPPER::IndexContainerViewConstType const m_seri
Connection to element maps.
static constexpr integer numDof
Compute time value for the number of degrees of freedom.
STENCILWRAPPER const m_stencilWrapper
Reference to the stencil wrapper.
GEOS_HOST_DEVICE void computeFlux(localIndex const iconn, StackVariables &stack, FUNC &&kernelOp=NoOpFunc{}) const
Compute the local flux contributions to the residual and Jacobian.
static constexpr localIndex maxNumElems
Maximum number of elements at the face.
static void createAndLaunch(globalIndex const rankOffset, string const &dofKey, string const &solverName, ElementRegionManager const &elemManager, STENCILWRAPPER const &stencilWrapper, real64 const &dt, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs)
Create a new kernel and launch.
Define the interface for the assembly kernel in charge of flux terms.
ElementViewConst< arrayView2d< real64 const > > const m_dDens_dTemp
Views on derivatives of fluid densities.
static constexpr integer numEqn
Compute time value for the number of equations.
ElementViewConst< arrayView1d< real64 const > > const m_temp
Views on temperature.
ElementViewConst< arrayView3d< real64 const > > m_dThermalCond_dT
View on derivatives of thermal conductivity w.r.t. temperature.
ElementViewConst< arrayView2d< real64 const > > const m_enthalpy
Views on enthalpies.
static constexpr localIndex maxNumConns
Maximum number of connections at the face.
STENCILWRAPPER::IndexContainerViewConstType const m_seri
Connection to element maps.
FluxComputeKernel(globalIndex const rankOffset, STENCILWRAPPER const &stencilWrapper, DofNumberAccessor const &dofNumberAccessor, SinglePhaseFlowAccessors const &singlePhaseFlowAccessors, ThermalSinglePhaseFlowAccessors const &thermalSinglePhaseFlowAccessors, SinglePhaseFluidAccessors const &singlePhaseFluidAccessors, ThermalSinglePhaseFluidAccessors const &thermalSinglePhaseFluidAccessors, PermeabilityAccessors const &permeabilityAccessors, ThermalConductivityAccessors const &thermalConductivityAccessors, real64 const &dt, CRSMatrixView< real64, globalIndex const > const &localMatrix, arrayView1d< real64 > const &localRhs)
Constructor for the kernel interface.
static constexpr integer numDof
Compute time value for the number of degrees of freedom.
ElementViewConst< arrayView1d< real64 const > > const m_dMob_dTemp
Views on derivatives of fluid mobilities.
GEOS_HOST_DEVICE void complete(localIndex const iconn, StackVariables &stack) const
Performs the complete phase for the kernel.
GEOS_HOST_DEVICE void computeFlux(localIndex const iconn, StackVariables &stack) const
Compute the local flux contributions to the residual and Jacobian.
ElementViewConst< arrayView3d< real64 const > > m_thermalConductivity
View on thermal conductivity.
STENCILWRAPPER const m_stencilWrapper
Reference to the stencil wrapper.
ElementRegionManager::ElementViewConst< VIEWTYPE > ElementViewConst
The type for element-based data. Consists entirely of ArrayView's.
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Definition: DataTypes.hpp:180
LvArray::CRSMatrixView< T, COL_INDEX, localIndex const, LvArray::ChaiBuffer > CRSMatrixView
Alias for CRS Matrix View.
Definition: DataTypes.hpp:310
GEOS_GLOBALINDEX_TYPE globalIndex
Global index type (for indexing objects across MPI partitions).
Definition: DataTypes.hpp:88
StackArray< T, 1, MAXSIZE > stackArray1d
Alias for 1D stack array.
Definition: DataTypes.hpp:188
double real64
64-bit floating point type.
Definition: DataTypes.hpp:99
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Definition: DataTypes.hpp:85
std::int32_t integer
Signed integer type.
Definition: DataTypes.hpp:82
Kernel variables (dof numbers, jacobian and residual) located on the stack.
real64 dTrans_dPres[maxNumConns][2]
Derivatives of transmissibility with respect to pressure.
stackArray1d< globalIndex, maxNumElems *numDof > dofColIndices
Indices of the matrix rows/columns corresponding to the dofs in this face.
stackArray1d< real64, maxNumElems *numEqn > localFlux
Storage for the face local residual vector (all equations except volume balance)
localIndex const stencilSize
Stencil size for a given connection.
stackArray2d< real64, maxNumElems *numEqn *maxStencilSize *numDof > localFluxJacobian
Storage for the face local Jacobian matrix.
localIndex const numFluxElems
Number of elements for a given connection.
stackArray1d< real64, maxStencilSize > dEnergyFlux_dP
Derivatives of energy fluxes wrt pressure.
real64 dThermalTrans_dT[maxNumConns][2]
Derivatives of thermal transmissibility with respect to temperature.
stackArray1d< real64, maxStencilSize > dEnergyFlux_dT
Derivatives of energy fluxes wrt temperature.