Skip to content
Draft
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* ------------------------------------------------------------------------------------------------------------
* SPDX-License-Identifier: LGPL-2.1-only
*
* Copyright (c) 2016-2024 Lawrence Livermore National Security LLC
* Copyright (c) 2018-2024 TotalEnergies
* Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University
* Copyright (c) 2023-2024 Chevron
* Copyright (c) 2019- GEOS/GEOSX Contributors
* All rights reserved
*
* See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
* ------------------------------------------------------------------------------------------------------------
*/

/**
* @file StrainDependentPermeability.cpp
*/

#include "StrainDependentPermeability.hpp"

namespace geos
{

using namespace dataRepository;

namespace constitutive
{


StrainDependentPermeability::StrainDependentPermeability( string const & name, Group * const parent ):
PermeabilityBase( name, parent )
{
registerWrapper( viewKeyStruct::empiricalConstantString(), &m_empiricalConstant ).
setInputFlag( InputFlags::REQUIRED ).
setDescription( "an empirical constant." );

registerField< fields::permeability::dPerm_dVolStrain >( &m_dPerm_dVolStrain );
}

std::unique_ptr< ConstitutiveBase >
StrainDependentPermeability::deliverClone( string const & name,
Group * const parent ) const
{
return PermeabilityBase::deliverClone( name, parent );
}

void StrainDependentPermeability::allocateConstitutiveData( Group & parent,
localIndex const numPts )
{
// NOTE: enforcing 1 quadrature point
m_dPerm_dVolStrain.resize( 0, 1, 3 );

PermeabilityBase::allocateConstitutiveData( parent, numPts );
}

REGISTER_CATALOG_ENTRY( ConstitutiveBase, StrainDependentPermeability, string const &, Group * const )

}
} /* namespace geos */
Original file line number Diff line number Diff line change
@@ -0,0 +1,191 @@
/*
* ------------------------------------------------------------------------------------------------------------
* SPDX-License-Identifier: LGPL-2.1-only
*
* Copyright (c) 2016-2024 Lawrence Livermore National Security LLC
* Copyright (c) 2018-2024 TotalEnergies
* Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University
* Copyright (c) 2023-2024 Chevron
* Copyright (c) 2019- GEOS/GEOSX Contributors
* All rights reserved
*
* See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details.
* ------------------------------------------------------------------------------------------------------------
*/

/**
* @file StrainDependentPermeability.hpp
*/

#ifndef GEOS_CONSTITUTIVE_PERMEABILITY_STRAINDEPENDENTPERMEABILITY_HPP_
#define GEOS_CONSTITUTIVE_PERMEABILITY_STRAINDEPENDENTPERMEABILITY_HPP_

#include "constitutive/permeability/PermeabilityBase.hpp"


namespace geos
{
namespace constitutive
{

class StrainDependentPermeabilityUpdate : public PermeabilityBaseUpdate
{
public:

StrainDependentPermeabilityUpdate( arrayView3d< real64 > const & permeability,
arrayView3d< real64 > const & dPerm_dPressure,
arrayView3d< real64 > const & dPerm_dPorosity,
arrayView3d< real64 > const & dPerm_dVolStrain,
arrayView1d< real64 > const & referencePorosity,
arrayView3d< real64 > const & referencePermeability,
real64 const empiricalConstant )
: PermeabilityBaseUpdate( permeability, dPerm_dPressure ),
m_dPerm_dPorosity( dPerm_dPorosity ),
m_dPerm_dVolStrain( dPerm_dVolStrain ),
m_referencePorosity( referencePorosity ),
m_referencePermeability( referencePermeability ),
m_empiricalConstant( empiricalConstant )
{}

GEOS_HOST_DEVICE
void compute( real64 const & referencePorosity,
real64 const (&referencePermeability)[3],
real64 const & volStrain,
arraySlice1d< real64 > const & permeability,
arraySlice1d< real64 > const & dPerm_dPorosity,
arraySlice1d< real64 > const & dPerm_dVolStrain ) const;

GEOS_HOST_DEVICE
virtual void updateFromPressurePorosityAndStrain( localIndex const k,
localIndex const q,
real64 const & volStrain,
real64 const & pressure,
real64 const & porosity ) const override
{
GEOS_UNUSED_VAR( pressure, porosity );

real64 referencePermeability[3];

referencePermeability[0] = m_referencePermeability[k][0][0];
referencePermeability[1] = m_referencePermeability[k][0][1];
referencePermeability[2] = m_referencePermeability[k][0][2];

compute( m_referencePorosity[k],
referencePermeability,
volStrain,
m_permeability[k][q],
m_dPerm_dPorosity[k][q],
m_dPerm_dVolStrain[k][q] );
}

private:

/// dPermeability_dPorosity
arrayView3d< real64 > m_dPerm_dPorosity;

/// dPermeability_dVolumetricStrain
arrayView3d< real64 > m_dPerm_dVolStrain;

/// An empirical constant
real64 m_empiricalConstant;

/// Reference permeability
arrayView3d< real64 > m_referencePermeability;

/// Reference porosity
arrayView1d< real64 > m_referencePorosity;
};


class StrainDependentPermeability : public PermeabilityBase
{
public:

StrainDependentPermeability( string const & name, dataRepository::Group * const parent );

std::unique_ptr< ConstitutiveBase > deliverClone( string const & name,
dataRepository::Group * const parent ) const override;

static string catalogName() { return "StrainDependentPermeability"; }

virtual string getCatalogName() const override { return catalogName(); }

virtual void allocateConstitutiveData( dataRepository::Group & parent,
localIndex const numPts ) override;

/// Type of kernel wrapper for in-kernel update
using KernelWrapper = StrainDependentPermeabilityUpdate;

/**
* @brief Create an update kernel wrapper.
* @return the wrapper
*/
KernelWrapper createKernelWrapper() const
{
return KernelWrapper( m_permeability,
m_dPerm_dPressure,
m_dPerm_dPorosity,
m_dPerm_dVolStrain,
m_empiricalConstant,
m_referencePorosity,
m_referencePermeability );
}


struct viewKeyStruct : public PermeabilityBase::viewKeyStruct
{
static constexpr char const * dPerm_dPorosityString() { return "dPerm_dPorosity"; }
static constexpr char const * dPerm_dVolStrainString() { return "dPerm_dVolStrain"; }
static constexpr char const * empiricalConstantString() { return "empiricalConstant"; }
static constexpr char const * referencePorosityString() { return "referencePorosity"; }
static constexpr char const * referencePermeabilityString() { return "referencePermeability"; }
};

private:

/// dPermeability_dPorosity
array3d< real64 > m_dPerm_dPorosity;

/// dPermeability_dVolumetricStrain
array3d< real64 > m_dPerm_dVolStrain;

/// An empirical constant
real64 m_empiricalConstant;

/// Reference permeability
array3d< real64 > m_referencePermeability;

/// Reference porosity
array1d< real64 > m_referencePorosity;
};


GEOS_HOST_DEVICE
inline
void StrainDependentPermeabilityUpdate::compute( real64 const & referencePorosity,
real64 const (&referencePermeability)[3],
real64 const & volStrain,
arraySlice1d< real64 > const & permeability,
arraySlice1d< real64 > const & dPerm_dPorosity,
arraySlice1d< real64 > const & dPerm_dVolStrain ) const
{
real64 const por = 1 - (1 - referencePorosity) * LvArray::math::exp(-volStrain);

real64 const permMultiplier = LvArray::math::pow( por/referencePorosity, m_empiricalConstant );

real64 const dpermMultiplier_dVolStrain = m_empiricalConstant * LvArray::math::pow( por/referencePorosity, m_empiricalConstant-1 ) /referencePorosity * ((1 - referencePorosity) * LvArray::math::exp(-volStrain));

for( localIndex i = 0; i < permeability.size(); ++i )
{
permeability[i] = permMultiplier * referencePermeability[i];
dPerm_dVolStrain[i] = dpermMultiplier_dVolStrain * referencePermeability[i];
}
}


}/* namespace constitutive */

} /* namespace geos */


#endif //GEOS_CONSTITUTIVE_PERMEABILITY_STRAINDEPENDENTPERMEABILITY_HPP_
Loading