19 #ifndef GEOS_FINITEVOLUME_FACEELEMENTTOCELLSTENCIL_HPP_
20 #define GEOS_FINITEVOLUME_FACEELEMENTTOCELLSTENCIL_HPP_
22 #include "StencilBase.hpp"
35 template<
typename VIEWTYPE >
106 real64 ( &dWeight_dVar )[1][2] )
const;
119 real64 ( &dWeight_dVar )[1][2] )
const;
137 real64 ( &dWeight_dVar1 )[1][2],
138 real64 ( &dWeight_dVar2 )[1][2] )
const;
147 real64 ( & stabilizationWeight )[1][2] )
const
194 virtual void move( LvArray::MemorySpace
const space )
override;
197 localIndex const *
const elementRegionIndices,
198 localIndex const *
const elementSubRegionIndices,
200 real64 const *
const weights,
210 real64 const (&faceNormal)[3],
211 real64 const (&cellToFaceVec)[3] );
258 real64 ( & weight )[1][2],
259 real64 ( & dWeight_dVar )[1][2] )
const
272 LvArray::tensorOps::hadamardProduct< 3 >( faceConormal, coefficient[er0][esr0][ei0][0], m_faceNormal[iconn] );
273 real64 const t0 =
m_weights[iconn][0] * LvArray::tensorOps::AiBi< 3 >( m_cellToFaceVec[iconn], faceConormal );
275 real64 const t1 =
m_weights[iconn][1] * coefficient[er1][esr1][ei1][0][2];
277 real64 const sumOfTrans = t0+t1;
278 real64 const value = m_transMultiplier[iconn]*t0*t1/sumOfTrans;
280 weight[0][0] = value;
281 weight[0][1] = -value;
284 real64 const dt0 =
m_weights[iconn][0] * dCoeff_dVar[er0][esr0][ei0][0][0];
285 real64 const dt1 =
m_weights[iconn][1] * dCoeff_dVar[er1][esr1][ei1][0][2];
287 dWeight_dVar[0][0] = ( dt0 * t1 * sumOfTrans - dt0 * t0 * t1 ) / ( sumOfTrans * sumOfTrans );
288 dWeight_dVar[0][1] = ( t0 * dt1 * sumOfTrans - dt1 * t0 * t1 ) / ( sumOfTrans * sumOfTrans );
295 real64 ( & weight )[1][2],
296 real64 ( & dWeight_dVar )[1][2] )
const
299 real64 const t0 = m_weights[iconn][0] * LvArray::tensorOps::AiBi< 3 >( m_cellToFaceVec[iconn], m_faceNormal[iconn] );
300 real64 const t1 = m_weights[iconn][1];
302 real64 const sumOfTrans = t0+t1;
303 real64 const value = m_transMultiplier[iconn]*t0*t1/sumOfTrans;
305 weight[0][0] = value;
306 weight[0][1] = -value;
308 dWeight_dVar[0][0] = 0.0;
309 dWeight_dVar[0][1] = 0.0;
320 real64 (& dWeight_dVar1 )[1][2],
321 real64 (& dWeight_dVar2 )[1][2] )
const
334 LvArray::tensorOps::hadamardProduct< 3 >( faceConormal, coefficient[er0][esr0][ei0][0], m_faceNormal[iconn] );
335 real64 const t0 =
m_weights[iconn][0] * LvArray::tensorOps::AiBi< 3 >( m_cellToFaceVec[iconn], faceConormal );
337 real64 const t1 =
m_weights[iconn][1] * coefficient[er1][esr1][ei1][0][2];
339 real64 const sumOfTrans = t0+t1;
340 real64 const value = m_transMultiplier[iconn]*t0*t1/sumOfTrans;
342 weight[0][0] = value;
343 weight[0][1] = -value;
346 real64 const dt0_dVar1 =
m_weights[iconn][0] * dCoeff_dVar1[er0][esr0][ei0][0][0];
347 real64 const dt1_dVar1 =
m_weights[iconn][1] * dCoeff_dVar1[er1][esr1][ei1][0][2];
348 real64 const dt0_dVar2 =
m_weights[iconn][0] * dCoeff_dVar2[er0][esr0][ei0][0][0];
349 real64 const dt1_dVar2 =
m_weights[iconn][1] * dCoeff_dVar2[er1][esr1][ei1][0][2];
351 dWeight_dVar1[0][0] = ( dt0_dVar1 * t1 * sumOfTrans - dt0_dVar1 * t0 * t1 ) / ( sumOfTrans * sumOfTrans );
352 dWeight_dVar1[0][1] = ( t0 * dt1_dVar1 * sumOfTrans - dt1_dVar1 * t0 * t1 ) / ( sumOfTrans * sumOfTrans );
354 dWeight_dVar2[0][0] = ( dt0_dVar2 * t1 * sumOfTrans - dt0_dVar2 * t0 * t1 ) / ( sumOfTrans * sumOfTrans );
355 dWeight_dVar2[0][1] = ( t0 * dt1_dVar2 * sumOfTrans - dt1_dVar2 * t0 * t1 ) / ( sumOfTrans * sumOfTrans );
#define GEOS_HOST_DEVICE
Marks a host-device function.
#define GEOS_UNUSED_VAR(...)
Mark an unused variable and silence compiler warnings.
#define GEOS_FORCE_INLINE
Marks a function or lambda for inlining.
typename ElementViewAccessor< VIEWTYPE >::NestedViewTypeConst ElementViewConst
The ElementViewAccessor at the ElementRegionManager level is the type resulting from ElementViewAcces...
virtual localIndex size() const override
Return the stencil size.
KernelWrapper createKernelWrapper() const
Create an update kernel wrapper.
virtual void reserve(localIndex const size) override
Reserve the size of the stencil.
void addVectors(real64 const &transMultiplier, real64 const (&faceNormal)[3], real64 const (&cellToFaceVec)[3])
Adds the vectors need to compute weights needed in kernels.
virtual void move(LvArray::MemorySpace const space) override
Move the data arrays associated with the stencil to a specified memory space.
virtual void add(localIndex const numPts, localIndex const *const elementRegionIndices, localIndex const *const elementSubRegionIndices, localIndex const *const elementIndices, real64 const *const weights, localIndex const connectorIndex) override
Add an entry to the stencil.
constexpr localIndex stencilSize(localIndex index) const
Give the number of points in a stencil entry.
FaceElementToCellStencil()
Default constructor.
Provides access to the FaceElementToCellStencil that may be called from a kernel function.
GEOS_HOST_DEVICE constexpr GEOS_FORCE_INLINE localIndex stencilSize(localIndex index) const
Give the number of stencil entries for the provided index.
FaceElementToCellStencilWrapper(IndexContainerType const &elementRegionIndices, IndexContainerType const &elementSubRegionIndices, IndexContainerType const &elementIndices, WeightContainerType const &weights, arrayView2d< real64 > const &faceNormal, arrayView2d< real64 > const &cellToFaceVec, arrayView1d< real64 > const &transMultiplier)
Constructor.
GEOS_HOST_DEVICE GEOS_FORCE_INLINE localIndex size() const
Give the number of stencil entries.
GEOS_HOST_DEVICE void computeWeights(localIndex iconn, CoefficientAccessor< arrayView3d< real64 const > > const &coefficient, CoefficientAccessor< arrayView3d< real64 const > > const &dCoeff_dVar, real64(&weight)[1][2], real64(&dWeight_dVar)[1][2]) const
Compute weigths and derivatives w.r.t to one variable.
GEOS_HOST_DEVICE void removeHydraulicApertureContribution(localIndex const iconn, ElementRegionManager::ElementViewConst< arrayView1d< real64 const > > hydraulicAperture) const
Remove the contribution of the aperture from the weight in the stencil (done before aperture update)
ElementRegionManager::ElementViewConst< VIEWTYPE > CoefficientAccessor
Coefficient view accessory type.
GEOS_HOST_DEVICE void computeStabilizationWeights(localIndex iconn, real64(&stabilizationWeight)[1][2]) const
Compute the stabilization weights.
GEOS_HOST_DEVICE constexpr GEOS_FORCE_INLINE localIndex numPointsInFlux(localIndex index) const
Give the number of points between which the flux is.
GEOS_HOST_DEVICE void addHydraulicApertureContribution(localIndex const iconn, ElementRegionManager::ElementViewConst< arrayView1d< real64 const > > hydraulicAperture) const
Add the contribution of the aperture to the weight in the stencil (done after aperture update)
Provides management of the interior stencil points when using Two-Point flux approximation.
TRAITS::IndexContainerType m_elementRegionIndices
The container for the element region indices for each point in each stencil.
TRAITS::IndexContainerViewConstType m_elementRegionIndices
The container for the element region indices for each point in each stencil.
TRAITS::IndexContainerViewConstType m_elementSubRegionIndices
The container for the element sub region indices for each point in each stencil.
TRAITS::WeightContainerViewType m_weights
The container for the weights for each point in each stencil.
TRAITS::IndexContainerViewConstType m_elementIndices
The container for the element indices for each point in each stencil.
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
Array< T, 2, PERMUTATION > array2d
Alias for 2D array.
double real64
64-bit floating point type.
ArrayView< T, 2, USD > arrayView2d
Alias for 2D array view.
GEOSX_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
Array< T, 1 > array1d
Alias for 1D array.
ArrayView< T, 3, USD > arrayView3d
Alias for 3D array view.
CONTAINER< localIndex > IndexContainerType
The array type that will be used to store the indices of the stencil contributors.
static constexpr localIndex maxStencilSize
Maximum number of points in a stencil.
CONTAINER< real64 > WeightContainerType
The array type that is used to store the weights of the stencil contributors.
static constexpr localIndex maxNumPointsInFlux
Maximum number of points the flux.