From 584cda50fc4f36da61be5ffd44905c8c251ddd17 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 14 Aug 2024 14:58:47 -0500 Subject: [PATCH 1/5] Reuse computeSinglePhaseFlux --- .../fluidFlow/SinglePhaseFVMKernels.hpp | 158 ++++-------------- 1 file changed, 29 insertions(+), 129 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp index d2b6f0db263..72739eeaf52 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp @@ -37,12 +37,14 @@ #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "physicsSolvers/fluidFlow/FluxKernelsHelper.hpp" namespace geos { namespace singlePhaseFVMKernels { +using namespace fluxKernelsHelper; /******************************** FaceBasedAssemblyKernelBase ********************************/ @@ -345,135 +347,33 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase { for( k[1] = k[0] + 1; k[1] < stack.numFluxElems; ++k[1] ) { - // clear working arrays - real64 densMean = 0.0; - real64 dDensMean_dP[2]{0.0, 0.0}; - - // create local work arrays real64 fluxVal = 0.0; - real64 dFlux_dP[2]{0.0, 0.0}; - - real64 const trans[2] = { stack.transmissibility[connectionIndex][0], stack.transmissibility[connectionIndex][1] }; - real64 const dTrans_dP[2] = { stack.dTrans_dPres[connectionIndex][0], stack.dTrans_dPres[connectionIndex][1] }; - - real64 presGrad = 0.0; - real64 dPresGrad_dP[2]{0.0, 0.0}; - - real64 gravHead = 0.0; - real64 dGravHead_dP[2]{0.0, 0.0}; - - localIndex const seri[2] = {m_seri( iconn, k[0] ), m_seri( iconn, k[1] )}; - localIndex const sesri[2] = {m_sesri( iconn, k[0] ), m_sesri( iconn, k[1] )}; - localIndex const sei[2] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; - - // calculate quantities on primary connected cells - for( integer ke = 0; ke < 2; ++ke ) - { - // density - real64 const density = m_dens[seri[ke]][sesri[ke]][sei[ke]][0]; - real64 const dDens_dP = m_dDens_dPres[seri[ke]][sesri[ke]][sei[ke]][0]; - - // average density and derivatives - densMean += 0.5 * density; - dDensMean_dP[ke] = 0.5 * dDens_dP; - } - - //***** calculation of flux ***** - - // compute potential difference - real64 potScale = 0.0; - real64 dPresGrad_dTrans = 0.0; - real64 dGravHead_dTrans = 0.0; - int signPotDiff[2] = {1, -1}; - - for( integer ke = 0; ke < 2; ++ke ) - { - localIndex const er = seri[ke]; - localIndex const esr = sesri[ke]; - localIndex const ei = sei[ke]; - - real64 const pressure = m_pres[er][esr][ei]; - presGrad += trans[ke] * pressure; - dPresGrad_dTrans += signPotDiff[ke] * pressure; - dPresGrad_dP[ke] = trans[ke]; - - real64 const gravD = trans[ke] * m_gravCoef[er][esr][ei]; - real64 const pot = trans[ke] * pressure - densMean * gravD; - - gravHead += densMean * gravD; - dGravHead_dTrans += signPotDiff[ke] * densMean * m_gravCoef[er][esr][ei]; - - for( integer i = 0; i < 2; ++i ) - { - dGravHead_dP[i] += dDensMean_dP[i] * gravD; - } - - potScale = fmax( potScale, fabs( pot ) ); - } - - for( integer ke = 0; ke < 2; ++ke ) - { - dPresGrad_dP[ke] += dTrans_dP[ke] * dPresGrad_dTrans; - dGravHead_dP[ke] += dTrans_dP[ke] * dGravHead_dTrans; - } - - // *** upwinding *** - - // compute potential gradient - real64 const potGrad = presGrad - gravHead; - - // compute upwinding tolerance - real64 constexpr upwRelTol = 1e-8; - real64 const upwAbsTol = fmax( potScale * upwRelTol, LvArray::NumericLimits< real64 >::epsilon ); - - // decide mobility coefficients - smooth variation in [-upwAbsTol; upwAbsTol] - real64 const alpha = ( potGrad + upwAbsTol ) / ( 2 * upwAbsTol ); - - // choose upstream cell - real64 mobility{}; - real64 dMob_dP[2]{}; - if( alpha <= 0.0 || alpha >= 1.0 ) - { - localIndex const k_up = 1 - localIndex( fmax( fmin( alpha, 1.0 ), 0.0 ) ); - - mobility = m_mob[seri[k_up]][sesri[k_up]][sei[k_up]]; - dMob_dP[k_up] = m_dMob_dPres[seri[k_up]][sesri[k_up]][sei[k_up]]; - } - else - { - real64 const mobWeights[2] = { alpha, 1.0 - alpha }; - for( integer ke = 0; ke < 2; ++ke ) - { - mobility += mobWeights[ke] * m_mob[seri[ke]][sesri[ke]][sei[ke]]; - dMob_dP[ke] = mobWeights[ke] * m_dMob_dPres[seri[ke]][sesri[ke]][sei[ke]]; - } - } - - // pressure gradient depends on all points in the stencil - for( integer ke = 0; ke < 2; ++ke ) - { - dFlux_dP[ke] += dPresGrad_dP[ke]; - } - - // gravitational head depends only on the two cells connected (same as mean density) - for( integer ke = 0; ke < 2; ++ke ) - { - dFlux_dP[ke] -= dGravHead_dP[ke]; - } - - // compute the flux and derivatives using upstream cell mobility - fluxVal = mobility * potGrad; - - for( integer ke = 0; ke < 2; ++ke ) - { - dFlux_dP[ke] *= mobility; - } - - // add contribution from upstream cell mobility derivatives - for( integer ke = 0; ke < 2; ++ke ) - { - dFlux_dP[ke] += dMob_dP[ke] * potGrad; - } + real64 dFlux_dTrans = 0.0; + real64 alpha = 0.0; + real64 mobility = 0.0; + real64 potGrad = 0.0; + real64 trans[2] = {stack.transmissibility[connectionIndex][0], stack.transmissibility[connectionIndex][1]}; + real64 dTrans[2] = { stack.dTrans_dPres[connectionIndex][0], stack.dTrans_dPres[connectionIndex][1] }; + real64 dFlux_dP[2] = {0.0, 0.0}; + localIndex const regionIndex[2] = {m_seri( iconn, k[0] ), m_seri( iconn, k[1] )}; + localIndex const subRegionIndex[2] = {m_sesri( iconn, k[0] ), m_sesri( iconn, k[1] )}; + localIndex const elementIndex[2] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; + + computeSinglePhaseFlux( regionIndex, subRegionIndex, elementIndex, + trans, + dTrans, + m_pres, + m_gravCoef, + m_dens, + m_dDens_dPres, + m_mob, + m_dMob_dPres, + alpha, + mobility, + potGrad, + fluxVal, + dFlux_dP, + dFlux_dTrans ); // populate local flux vector and derivatives stack.localFlux[k[0]*numEqn] += m_dt * fluxVal; @@ -487,7 +387,7 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase } // Customize the kernel with this lambda - kernelOp( k, seri, sesri, sei, connectionIndex, alpha, mobility, potGrad, fluxVal, dFlux_dP ); + kernelOp( k, regionIndex, subRegionIndex, elementIndex, connectionIndex, alpha, mobility, potGrad, fluxVal, dFlux_dP ); connectionIndex++; } From 995d1f965bcec69bbf197ce418f5550a90d0eae5 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 15 Aug 2024 08:25:50 -0500 Subject: [PATCH 2/5] Update SinglePhaseFVMKernels.hpp --- .../physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp index 72739eeaf52..26948d6b336 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp @@ -352,7 +352,7 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase real64 alpha = 0.0; real64 mobility = 0.0; real64 potGrad = 0.0; - real64 trans[2] = {stack.transmissibility[connectionIndex][0], stack.transmissibility[connectionIndex][1]}; + real64 trans[2] = { stack.transmissibility[connectionIndex][0], stack.transmissibility[connectionIndex][1] }; real64 dTrans[2] = { stack.dTrans_dPres[connectionIndex][0], stack.dTrans_dPres[connectionIndex][1] }; real64 dFlux_dP[2] = {0.0, 0.0}; localIndex const regionIndex[2] = {m_seri( iconn, k[0] ), m_seri( iconn, k[1] )}; From de102306c1cc7accb2f74784f8e90d6542d07803 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Mon, 19 Aug 2024 09:16:02 -0500 Subject: [PATCH 3/5] Update SinglePhaseFVMKernels.hpp --- .../fluidFlow/SinglePhaseFVMKernels.hpp | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp index 26948d6b336..5b6e76ef2d6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp @@ -44,7 +44,6 @@ namespace geos namespace singlePhaseFVMKernels { -using namespace fluxKernelsHelper; /******************************** FaceBasedAssemblyKernelBase ********************************/ @@ -359,21 +358,21 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase localIndex const subRegionIndex[2] = {m_sesri( iconn, k[0] ), m_sesri( iconn, k[1] )}; localIndex const elementIndex[2] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; - computeSinglePhaseFlux( regionIndex, subRegionIndex, elementIndex, - trans, - dTrans, - m_pres, - m_gravCoef, - m_dens, - m_dDens_dPres, - m_mob, - m_dMob_dPres, - alpha, - mobility, - potGrad, - fluxVal, - dFlux_dP, - dFlux_dTrans ); + fluxKernelsHelper::computeSinglePhaseFlux( regionIndex, subRegionIndex, elementIndex, + trans, + dTrans, + m_pres, + m_gravCoef, + m_dens, + m_dDens_dPres, + m_mob, + m_dMob_dPres, + alpha, + mobility, + potGrad, + fluxVal, + dFlux_dP, + dFlux_dTrans ); // populate local flux vector and derivatives stack.localFlux[k[0]*numEqn] += m_dt * fluxVal; From df8f649e0af36c3dc7a9daaf0f81c803a2dca7c8 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 21 Aug 2024 16:55:17 -0700 Subject: [PATCH 4/5] Update .integrated_tests.yaml --- .integrated_tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index aa92ea9845d..46dda511783 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3249-6781-4998bc8 + baseline: integratedTests/baseline_integratedTests-pr3283-6949-4ee437f allow_fail: all: '' From 1060c7e39fd065b7a5d87c758fd1737f2bef1426 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 22 Aug 2024 08:35:27 -0500 Subject: [PATCH 5/5] Update BASELINE_NOTES.md --- BASELINE_NOTES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index ec3a090f405..22a4daed414 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -7,6 +7,10 @@ Any developer who updates the baseline ID in the .integrated_tests.yaml file is These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3283 (2024-08-22) +====================== +Reuse computeSinglePhaseFlux. Rebaseline due to minor numerical diffs. + PR #3249 (2024-08-14) ======================