Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
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
Expand Up @@ -302,7 +302,7 @@ AquiferBoundaryCondition::KernelWrapper AquiferBoundaryCondition::createKernelWr
pressureInfluenceFunction.createKernelWrapper() );
}

REGISTER_CATALOG_ENTRY( FieldSpecification, AquiferBoundaryCondition, string const &, Group * const )
REGISTER_CATALOG_ENTRY( FieldSpecificationABC, AquiferBoundaryCondition, string const &, Group * const )


} /* namespace geos */
7 changes: 7 additions & 0 deletions src/coreComponents/fieldSpecification/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,16 @@ set( fieldSpecification_headers
DirichletBoundaryCondition.hpp
EquilibriumInitialCondition.hpp
FieldSpecification.hpp
FieldSpecificationABC.hpp
FieldSpecificationFactory.hpp
FieldSpecificationManager.hpp
FieldSpecificationImpl.hpp
SourceFluxBoundaryCondition.hpp
TractionBoundaryCondition.hpp
AquiferBoundaryCondition.hpp
PerfectlyMatchedLayer.hpp
PermeabilitySpecification.hpp
PermeabilitySpecificationFactory.hpp
)

#
Expand All @@ -41,11 +45,14 @@ set( fieldSpecification_sources
DirichletBoundaryCondition.cpp
EquilibriumInitialCondition.cpp
FieldSpecification.cpp
FieldSpecificationABC.cpp
FieldSpecificationManager.cpp
SourceFluxBoundaryCondition.cpp
TractionBoundaryCondition.cpp
AquiferBoundaryCondition.cpp
PerfectlyMatchedLayer.cpp
PermeabilitySpecification.cpp
PermeabilitySpecificationFactory.cpp
)

set( dependencyList ${parallelDeps} mesh )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,6 @@ DirichletBoundaryCondition::~DirichletBoundaryCondition()



REGISTER_CATALOG_ENTRY( FieldSpecification, DirichletBoundaryCondition, string const &, Group * const )
REGISTER_CATALOG_ENTRY( FieldSpecificationABC, DirichletBoundaryCondition, string const &, Group * const )

} /* namespace geos */
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ void EquilibriumInitialCondition::initializePreSubGroups()
}
}

REGISTER_CATALOG_ENTRY( FieldSpecification, EquilibriumInitialCondition, string const &, Group * const )
REGISTER_CATALOG_ENTRY( FieldSpecificationABC, EquilibriumInitialCondition, string const &, Group * const )


} /* namespace geos */
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ namespace geos
using namespace dataRepository;

FieldSpecification::FieldSpecification( string const & name, Group * parent ):
Group( name, parent )
FieldSpecificationABC( name, parent )
{
setInputFlags( InputFlags::OPTIONAL_NONUNIQUE );

Expand Down Expand Up @@ -129,6 +129,6 @@ void FieldSpecification::setMeshObjectPath( Group const & meshBodies )



REGISTER_CATALOG_ENTRY( FieldSpecification, FieldSpecification, string const &, Group * const )
REGISTER_CATALOG_ENTRY( FieldSpecificationABC, FieldSpecification, string const &, Group * const )

}
17 changes: 16 additions & 1 deletion src/coreComponents/fieldSpecification/FieldSpecification.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "common/DataTypes.hpp"
#include "common/format/EnumStrings.hpp"
#include "dataRepository/Group.hpp"
#include "fieldSpecification/FieldSpecificationABC.hpp"
#include "mesh/MeshObjectPath.hpp"

namespace geos
Expand All @@ -35,7 +36,7 @@ class Function;
* @class FieldSpecification
* A class to hold values for and administer a single boundary condition
*/
class FieldSpecification : public dataRepository::Group
class FieldSpecification : public FieldSpecificationABC
{
public:

Expand Down Expand Up @@ -222,6 +223,20 @@ class FieldSpecification : public dataRepository::Group
void setFieldName( string const & fieldName )
{ m_fieldName = fieldName; }

/**
* Mutator
* @param[in] component The component axis or a special value.
*/
void setComponent( int component )
{ m_component = component; }

/**
* Mutator
* @param[in] functionName The name of the function
*/
void setFunctionName( string const & functionName )
{ m_functionName = functionName; }

/**
* Mutator
* @param[in] objectPath The path for the object
Expand Down
36 changes: 36 additions & 0 deletions src/coreComponents/fieldSpecification/FieldSpecificationABC.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* ------------------------------------------------------------------------------------------------------------
* 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.
* ------------------------------------------------------------------------------------------------------------
*/

#include "FieldSpecificationABC.hpp"

namespace geos
{
using namespace dataRepository;

FieldSpecificationABC::FieldSpecificationABC( string const & name, Group * parent ):
Group( name, parent )
{}

FieldSpecificationABC::~FieldSpecificationABC()
{}

FieldSpecificationABC::CatalogInterface::CatalogType &
FieldSpecificationABC::getCatalog()
{
static FieldSpecificationABC::CatalogInterface::CatalogType catalog;
return catalog;
}

}
107 changes: 107 additions & 0 deletions src/coreComponents/fieldSpecification/FieldSpecificationABC.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
* ------------------------------------------------------------------------------------------------------------
* 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 FieldSpecificationABC.hpp
*/

#ifndef GEOS_FIELDSPECIFICATION_FIELDSPECIFICATIONABC_HPP
#define GEOS_FIELDSPECIFICATION_FIELDSPECIFICATIONABC_HPP


#include "common/DataTypes.hpp"
#include "dataRepository/Group.hpp"
#include "functions/FunctionBase.hpp"
#include "functions/FunctionManager.hpp"

namespace geos
{
class Function;


/**
* @class FieldSpecificationABC
*
* Abstract Base Class grouping multiple types of field specifications.
*/
class FieldSpecificationABC : public dataRepository::Group
{
public:

/**
* @defgroup alias and functions to define statically initialized catalog
* @{
*/

/**
* alias to define the catalog type for this abstract type
*/
using CatalogInterface = dataRepository::CatalogInterface< FieldSpecificationABC,
string const &,
dataRepository::Group * const >;

/**
* @brief static function to return static catalog.
* @return the static catalog to create derived types through the static factory methods.
*/
static CatalogInterface::CatalogType & getCatalog();

/**
* @brief return the catalog name
* @return the catalog name
*/
virtual const string getCatalogName() const = 0;

/**
* @}
*/


/**
* @brief constructor
* @param name the name of the FieldSpecificationABC in the data repository
* @param parent the parent group of this group.
*/
FieldSpecificationABC( string const & name, dataRepository::Group * parent );

/**
* destructor
*/
virtual ~FieldSpecificationABC() override;


/// Deleted copy constructor
FieldSpecificationABC( FieldSpecificationABC const & ) = delete;

/// Defaulted move constructor
FieldSpecificationABC( FieldSpecificationABC && ) = default;

/// deleted copy assignment
FieldSpecificationABC & operator=( FieldSpecificationABC const & ) = delete;

/// deleted move assignement
FieldSpecificationABC & operator=( FieldSpecificationABC && ) = delete;

/**
* @brief View keys
*/
struct viewKeyStruct
{};

};

}

#endif //GEOS_FIELDSPECIFICATION_FIELDSPECIFICATIONABC_HPP
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* ------------------------------------------------------------------------------------------------------------
* 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 FieldSpecificationFactory.hpp
*/

#ifndef GEOS_FIELDSPECIFICATION_FIELDSPECIFICATIONFACTORY_HPP
#define GEOS_FIELDSPECIFICATION_FIELDSPECIFICATIONFACTORY_HPP


#include "common/DataTypes.hpp"
#include "dataRepository/Group.hpp"
#include "FieldSpecificationABC.hpp"

namespace geos
{

/**
* @class FieldSpecificationFactory
*
* This class provides a way to create FieldSpecification objects using
* other type of specifications. One could think of those types of
* specification to blueprints or "high-level" specification
*/
class FieldSpecificationFactory
{
public:

/// @brief Generate FieldSpecifications based on the given "higher-level"
/// specification
/// @param specification The higher-level specification used as a blueprint
/// to create FieldSpecification
/// @param manager The parent to store the created FieldSpecifications
virtual void generate( FieldSpecificationABC const & specification,
dataRepository::Group & manager ) const = 0;

/// @return The key that represents the element this factory is about.
/// Purpose: link the factory to the specification it uses.
virtual string const getKey() const = 0;

};

}


#endif //GEOS_FIELDSPECIFICATION_FIELDSPECIFICATIONFACTORY_HPP
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include "mesh/MeshObjectPath.hpp"
#include "functions/FunctionManager.hpp"
#include "common/GEOS_RAJA_Interface.hpp"
#include "FieldSpecificationABC.hpp"

namespace geos
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,13 @@
*/

#include "FieldSpecificationManager.hpp"
#include "FieldSpecificationABC.hpp"
#include "mesh/DomainPartition.hpp"
#include "mesh/MeshBody.hpp"
#include "mesh/MeshObjectPath.hpp"
#include "PermeabilitySpecification.hpp"
#include "FieldSpecificationFactory.hpp"
#include "PermeabilitySpecificationFactory.hpp"

namespace geos
{
Expand All @@ -34,6 +38,7 @@ FieldSpecificationManager::FieldSpecificationManager( string const & name, Group
GEOS_ERROR_IF( m_instance != nullptr, "Only one FieldSpecificationManager can exist at a time." );
m_instance = this;

registerFactory( std::make_unique< PermeabilitySpecificationFactory >() );
}

FieldSpecificationManager::~FieldSpecificationManager()
Expand All @@ -53,21 +58,38 @@ FieldSpecificationManager & FieldSpecificationManager::getInstance()
Group * FieldSpecificationManager::createChild( string const & childKey, string const & childName )
{
GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) );
std::unique_ptr< FieldSpecification > bc =
FieldSpecification::CatalogInterface::factory( childKey, getDataContext(), childName, this );
std::unique_ptr< FieldSpecificationABC > bc =
FieldSpecificationABC::CatalogInterface::factory( childKey, getDataContext(), childName, this );
return &this->registerGroup( childName, std::move( bc ) );
}


void FieldSpecificationManager::expandObjectCatalogs()
{
// During schema generation, register one of each type derived from BoundaryConditionBase here
for( auto & catalogIter: FieldSpecification::getCatalog())
for( auto & catalogIter: FieldSpecificationABC::getCatalog())
{
createChild( catalogIter.first, catalogIter.first );
}
}

void FieldSpecificationManager::registerFactory( std::unique_ptr< FieldSpecificationFactory > factory )
{
m_factories.emplace( factory->getKey(), std::move( factory ) );
}

void FieldSpecificationManager::postInputInitialization()
{
forSubGroups< FieldSpecificationABC >( [&]( FieldSpecificationABC const & spec )
{
auto it = m_factories.find( spec.getCatalogName() );
if( it != m_factories.end() )
{
it->second->generate( spec, *this );
}
} );
}

void FieldSpecificationManager::validateBoundaryConditions( MeshLevel & mesh ) const
{
DomainPartition const & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" );
Expand Down
Loading
Loading