20 #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONSCALINGZFORMULATIONKERNEL_HPP
21 #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONSCALINGZFORMULATIONKERNEL_HPP
29 namespace isothermalCompositionalMultiphaseBaseKernels
49 using Base::m_compFrac;
51 using Base::m_compFracScalingFactor;
69 real64 const maxAbsolutePresChange,
70 real64 const maxCompFracChange,
87 pressureScalingFactor,
88 compFracScalingFactor ),
90 m_maxAbsolutePresChange( maxAbsolutePresChange ),
91 m_maxCompFracChange( maxCompFracChange )
105 real64 _localMaxDeltaPres,
106 real64 _localMaxDeltaTemp,
107 real64 _localMaxDeltaCompFrac,
108 real64 _localMinPresScalingFactor,
109 real64 _localMinTempScalingFactor,
110 real64 _localMinCompFracScalingFactor )
112 Base::StackVariables( _localMinVal ),
113 localMaxDeltaPres( _localMaxDeltaPres ),
114 localMaxDeltaTemp( _localMaxDeltaTemp ),
115 localMaxDeltaCompFrac( _localMaxDeltaCompFrac ),
116 localMinPresScalingFactor( _localMinPresScalingFactor ),
117 localMinTempScalingFactor( _localMinTempScalingFactor ),
118 localMinCompFracScalingFactor( _localMinCompFracScalingFactor )
123 real64 localMaxDeltaCompFrac;
125 real64 localMinPresScalingFactor;
126 real64 localMinTempScalingFactor;
127 real64 localMinCompFracScalingFactor;
138 template<
typename POLICY,
typename KERNEL_TYPE >
141 KERNEL_TYPE
const & kernelComponent )
143 RAJA::ReduceMin< ReducePolicy< POLICY >,
real64 > globalScalingFactor( 1.0 );
145 RAJA::ReduceMax< ReducePolicy< POLICY >,
real64 > maxDeltaPres( 0.0 );
146 RAJA::ReduceMax< ReducePolicy< POLICY >,
real64 > maxDeltaTemp( 0.0 );
147 RAJA::ReduceMax< ReducePolicy< POLICY >,
real64 > maxDeltaCompFrac( 0.0 );
149 RAJA::ReduceMin< ReducePolicy< POLICY >,
real64 > minPresScalingFactor( 1.0 );
150 RAJA::ReduceMin< ReducePolicy< POLICY >,
real64 > minTempScalingFactor( 1.0 );
151 RAJA::ReduceMin< ReducePolicy< POLICY >,
real64 > minCompFracScalingFactor( 1.0 );
155 if( kernelComponent.ghostRank( ei ) >= 0 )
161 kernelComponent.setup( ei, stack );
162 kernelComponent.compute( ei, stack );
164 globalScalingFactor.min( stack.localMinVal );
166 maxDeltaPres.max( stack.localMaxDeltaPres );
167 maxDeltaTemp.max( stack.localMaxDeltaTemp );
168 maxDeltaCompFrac.max( stack.localMaxDeltaCompFrac );
170 minPresScalingFactor.min( stack.localMinPresScalingFactor );
171 minTempScalingFactor.min( stack.localMinTempScalingFactor );
172 minCompFracScalingFactor.min( stack.localMinCompFracScalingFactor );
178 maxDeltaCompFrac.get(),
179 minPresScalingFactor.get(),
180 minTempScalingFactor.get(),
181 minCompFracScalingFactor.get() );
186 StackVariables & stack )
const
190 stack.localMaxDeltaPres = 0.0;
191 stack.localMaxDeltaTemp = 0.0;
192 stack.localMaxDeltaCompFrac = 0.0;
194 stack.localMinPresScalingFactor = 1.0;
195 stack.localMinTempScalingFactor = 1.0;
196 stack.localMinCompFracScalingFactor = 1.0;
218 template<
typename FUNC = NoOpFunc >
222 FUNC && kernelOp = NoOpFunc{} )
const
224 real64 constexpr eps = minDensForDivision;
229 if( stack.localMaxDeltaPres < absPresChange )
231 stack.localMaxDeltaPres = absPresChange;
235 real64 presScalingFactor = 1.0;
237 if( m_maxAbsolutePresChange > 0.0 )
239 if( absPresChange > m_maxAbsolutePresChange )
241 presScalingFactor = m_maxAbsolutePresChange / absPresChange;
244 else if( pres > eps )
246 real64 const relativePresChange = absPresChange / pres;
253 if( stack.localMinVal > presScalingFactor )
255 stack.localMinVal = presScalingFactor;
257 if( stack.localMinPresScalingFactor > presScalingFactor )
259 stack.localMinPresScalingFactor = presScalingFactor;
263 m_compFracScalingFactor[ei] = 1.0;
269 if( stack.localMaxDeltaCompFrac < absCompFracChange )
271 stack.localMaxDeltaCompFrac = absCompFracChange;
274 if( absCompFracChange > m_maxCompFracChange && absCompFracChange > eps )
276 real64 const compScalingFactor = m_maxCompFracChange / absCompFracChange;
277 m_compFracScalingFactor[ei] = LvArray::math::min( m_compFracScalingFactor[ei], compScalingFactor );
278 if( stack.localMinVal > compScalingFactor )
280 stack.localMinVal = compScalingFactor;
282 if( stack.localMinCompFracScalingFactor > compScalingFactor )
284 stack.localMinCompFracScalingFactor = compScalingFactor;
297 real64 const m_maxAbsolutePresChange;
298 real64 const m_maxCompFracChange;
322 template<
typename POLICY >
324 createAndLaunch(
real64 const maxRelativePresChange,
325 real64 const maxAbsolutePresChange,
326 real64 const maxCompFracChange,
338 numComp, dofKey, subRegion, localSolution, pressure, compFrac, pressureScalingFactor, compFracScalingFactor );
339 return SolutionScalingZFormulationKernel::launch< POLICY >( subRegion.
size(), kernel );
#define GEOS_HOST_DEVICE
Marks a host-device function.
localIndex size() const
Get the "size" of the group, which determines the number of elements in resizable wrappers.
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
GEOS_GLOBALINDEX_TYPE globalIndex
Global index type (for indexing objects across MPI partitions).
double real64
64-bit floating point type.
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
std::int32_t integer
Signed integer type.
ArrayView< T, 2, USD > arrayView2d
Alias for 2D array view.