19 #ifndef GEOS_FINITEVOLUME_MIMETICINNERPRODUCTS_BDVLMINNERPRODUCT_HPP_
20 #define GEOS_FINITEVOLUME_MIMETICINNERPRODUCTS_BDVLMINNERPRODUCT_HPP_
28 namespace mimeticInnerProduct
55 template< localIndex NF >
64 real64 const (&elemPerm)[ 3 ],
65 real64 const & lengthTolerance,
70 template< localIndex NF >
79 real64 const (&elemPerm)[ 3 ],
80 real64 const & lengthTolerance,
84 real64 const areaTolerance = lengthTolerance * lengthTolerance;
85 real64 const weightToleranceInv = 1e30 / lengthTolerance;
87 real64 cellToFaceMat[ NF ][ 3 ] = {{ 0 }};
88 real64 normalsMat[ NF ][ 3 ] = {{ 0 }};
89 real64 permMat[ 3 ][ 3 ] = {{ 0 }};
90 real64 faceAreaMat[ NF ][ NF ] = {{ 0 }};
92 real64 work_dimByDim[ 3 ][ 3 ] = {{ 0 }};
93 real64 work_numFacesByDim[ NF ][ 3 ] = {{ 0 }};
94 real64 work_dimByNumFaces[ 3 ][ NF ] = {{ 0 }};
95 real64 work_numFacesByNumFaces[ NF ][ NF ] = {{ 0 }};
97 real64 tpTransInv[ NF ] = { 0.0 };
103 for(
localIndex ifaceLoc = 0; ifaceLoc < NF; ++ifaceLoc )
105 real64 faceCenter[ 3 ], faceNormal[ 3 ], cellToFaceVec[ 3 ];
107 faceAreaMat[ ifaceLoc ][ ifaceLoc ] =
108 computationalGeometry::centroid_3DPolygon( faceToNodes[elemToFaces[ifaceLoc]],
114 LvArray::tensorOps::copy< 3 >( cellToFaceVec, faceCenter );
115 LvArray::tensorOps::subtract< 3 >( cellToFaceVec, elemCenter );
117 cellToFaceMat[ ifaceLoc ][0] = faceAreaMat[ ifaceLoc ][ ifaceLoc ] * cellToFaceVec[ 0 ];
118 cellToFaceMat[ ifaceLoc ][1] = faceAreaMat[ ifaceLoc ][ ifaceLoc ] * cellToFaceVec[ 1 ];
119 cellToFaceMat[ ifaceLoc ][2] = faceAreaMat[ ifaceLoc ][ ifaceLoc ] * cellToFaceVec[ 2 ];
121 if( LvArray::tensorOps::AiBi< 3 >( cellToFaceVec, faceNormal ) < 0.0 )
123 LvArray::tensorOps::scale< 3 >( faceNormal, -1 );
130 MimeticInnerProductHelpers::computeInvTPFATransWithMultiplier< NF >( elemPerm,
132 faceAreaMat[ifaceLoc][ifaceLoc],
133 transMultiplier[elemToFaces[ifaceLoc]],
137 tpTransInv[ifaceLoc] = diagEntry;
139 normalsMat[ ifaceLoc ][ 0 ] = faceNormal[ 0 ];
140 normalsMat[ ifaceLoc ][ 1 ] = faceNormal[ 1 ];
141 normalsMat[ ifaceLoc ][ 2 ] = faceNormal[ 2 ];
146 LvArray::tensorOps::Rij_eq_AikBkj< NF, 3, 3 >( work_numFacesByDim,
151 LvArray::tensorOps::Rij_eq_AkiBkj< 3, 3, NF >( work_dimByDim,
154 LvArray::tensorOps::invert< 3 >( work_dimByDim );
157 LvArray::tensorOps::Rij_eq_AikBjk< 3, NF, 3 >( work_dimByNumFaces,
159 work_numFacesByDim );
160 LvArray::tensorOps::Rij_eq_AikBkj< NF, NF, 3 >( transMatrix,
162 work_dimByNumFaces );
165 real64 const stabCoef = 2.0 / NF * LvArray::tensorOps::trace< NF >( transMatrix );
171 LvArray::tensorOps::Rij_eq_AkiAkj< 3, NF >( work_dimByDim,
173 LvArray::tensorOps::invert< 3 >( work_dimByDim );
176 LvArray::tensorOps::addIdentity< NF >( work_numFacesByNumFaces, -1 );
177 LvArray::tensorOps::Rij_eq_AikBjk< 3, NF, 3 >( work_dimByNumFaces,
180 LvArray::tensorOps::Rij_add_AikBkj< NF, NF, 3 >( work_numFacesByNumFaces,
182 work_dimByNumFaces );
185 LvArray::tensorOps::scaledAdd< NF, NF >( transMatrix, work_numFacesByNumFaces, -stabCoef );
190 LvArray::tensorOps::Rij_eq_AikBkj< NF, NF, NF >( work_numFacesByNumFaces,
193 LvArray::tensorOps::Rij_eq_AikBkj< NF, NF, NF >( transMatrix,
195 work_numFacesByNumFaces );
201 if( !isZero( LvArray::tensorOps::l2NormSquared< NF >( tpTransInv ) ) )
203 MimeticInnerProductHelpers::computeTransMatrixWithMultipliers< NF >( tpTransInv,
#define GEOS_HOST_DEVICE
Marks a host-device function.
#define GEOS_UNUSED_VAR(...)
Mark an unused variable and silence compiler warnings.
static GEOS_HOST_DEVICE void compute(arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const &nodePosition, arrayView1d< real64 const > const &transMultiplier, ArrayOfArraysView< localIndex const > const &faceToNodes, arraySlice1d< localIndex const > const &elemToFaces, arraySlice1d< real64 const > const &elemCenter, real64 const &elemVolume, real64 const (&elemPerm)[3], real64 const &lengthTolerance, arraySlice2d< real64 > const &transMatrix)
In a given element, recompute the transmissibility matrix in a cell using the inner product of Beirao...
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
LvArray::ArrayOfArraysView< T, INDEX_TYPE const, CONST_SIZES, LvArray::ChaiBuffer > ArrayOfArraysView
View of array of variable-sized arrays. See LvArray::ArrayOfArraysView for details.
ArraySlice< T, 2, USD > arraySlice2d
Alias for 2D array slice.
double real64
64-bit floating point type.
ArraySlice< T, 1, USD > arraySlice1d
Alias for 1D array slice.
ArrayView< T, 2, USD > arrayView2d
Alias for 2D array view.
GEOSX_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
static GEOS_HOST_DEVICE void makeFullTensor(real64 const (&values)[3], real64(&result)[3][3])
Create a full tensor from an array.